Googleツールバーに代表されるInternet Explorer用ツールバーなどのデスクバンド(IDeskBand)を表示したり消去するにはIWebBrowser2::ShowBrowserBarを利用する。
この関数は処理に成功しても失敗しても常にS_OKを返すので注意。また、引数として使われているVARIANT用のBOOL(VARIANT_TRUEとVARIANT_FALSE)はTRUE!=0、FALSE==0という関係ではないので気をつける必要がある。
デスクバンドのCLSID(GUID)はレジストリに登録されているものを用いる。ここでは例として検索用のエクスプローラーバーのGUIDを利用した。
#include "comdef.h"
#include "exdisp.h"
#include "mshtml.h"
//
// デスクバンドを表示/非表示する
//
//pszClsidに_T("{30D02401-6A81-11D0-8274-00C04FD5AE38}")のようなデスクバンドのGUIDを指定
//
bool ShowDeskBandI(IWebBrowser2* pIWebBrowser2,LPCTSTR pszClsid,bool bShow)
{
VARIANT vtBandGUID;
VARIANT vtShow;
VARIANT vEmpty;
if(pIWebBrowser2 == NULL || pszClsid == NULL || *pszClsid == NULL)
return false;
::VariantInit(&vEmpty);
V_VT(&vtShow) = VT_BOOL;
vtShow.boolVal = bShow ? VARIANT_TRUE : VARIANT_FALSE;
vtBandGUID.vt = VT_BSTR;
#ifdef UNICODE
vtBandGUID.bstrVal = ::SysAllocString(pszClsid);
#else
{
////////////////////////////////
//char*からWCHAR*へ変換
//
WCHAR* pszWchar;
{
int nLen;
//Unicodeに必要な文字数の取得
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszClsid,-1,NULL,0);
pszWchar = new WCHAR[nLen];
if(pszWchar)
{
//変換
nLen = ::MultiByteToWideChar(CP_THREAD_ACP,0,pszClsid,(int)::strlen(pszClsid)+1,pszWchar,nLen);
if(nLen == 0)
{
delete pszWchar;
pszWchar = NULL;
}
}
}
vtBandGUID.bstrVal = ::SysAllocString(pszWchar);
delete pszWchar; //処理が終わったらdelete
}
#endif
//戻り値は必ず(?)成功なのでチェックしない
::Sleep(0);
pIWebBrowser2->ShowBrowserBar(&vtBandGUID,&vtShow,&vEmpty);
::SysFreeString(vtBandGUID.bstrVal);
return true;
}
bool Test2(void)
{
HRESULT hr;
IWebBrowser2* pIWebBrowser2;
//IE起動
pIWebBrowser2 = NULL;
hr = ::CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_SERVER,IID_IWebBrowser2,(void**)&pIWebBrowser2);
if(FAILED(hr) || pIWebBrowser2 == NULL)
return false;
//IE可視化
hr = pIWebBrowser2->put_Visible(VARIANT_TRUE);
if(FAILED(hr))
{
pIWebBrowser2->Release();
return false;
}
//デスクバンド表示
ShowDeskBandI(pIWebBrowser2,_T("{30D02401-6A81-11D0-8274-00C04FD5AE38}"),true);
pIWebBrowser2->Release();
return true;
}
bool Test(void)
{
::CoInitialize(NULL);
Test2();
::CoUninitialize();
return true;
}
