IEツールバーボタンがクリックされたときに呼び出されるIE BHOを書いています。 IObjectWithSite
とIOleCommandTarget
を実装するCOMクラスであり、IClassFactory
を実装するクラスファクトリであるDLL関数DllMain DllGetClassObject
なども機能しています。私はEventSinc
が接続されていて、それがOnDocumentCompleteと他のイベントを呼び出したので動作することを知っています。IEツールバーボタンからBHOを呼び出す
登録コードはDllRegisterServer
にあり、regsvr32.exe
には登録コードがあります。
クリックでBHO機能を呼び出すIEツールバーボタンを追加しました。この記事ではAdding Toolbar Buttonsが見つかりました。DllRegisterServer
にボタン登録が追加されました。また、前述のcomオブジェクトにIOleCommandTarget
を追加し、ファイルに書き込むコードでExecメソッドを実装しました(Execが呼び出されたかどうかを確認するため)。 uninstalを再コンパイルして再インストールした後、ボタンをクリックするとDllGetClassObject
が呼び出され、すべての連続したクリックに対して何も起こりません。
何が間違っている可能性がありますか?
DllRegisterServer
if(RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Internet Explorer\\Extensions\\") CLSID_IEPlugin_Str, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hk, NULL) != ERROR_SUCCESS) return SELFREG_E_CLASS;
RegSetValueEx(hk, _T("ButtonText"), 0, REG_SZ, (const BYTE*)_T("BHO Toolbar Button"), sizeof("BHO Toolbar Button") * sizeof(TCHAR));
RegSetValueEx(hk, _T("Default Visible"), 0, REG_SZ, (const BYTE*)_T("Yes"), sizeof("Yes") * sizeof(TCHAR));
RegSetValueEx(hk, _T("CLSID"), 0, REG_SZ, (const BYTE*)_T("{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}"), sizeof("{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}") * sizeof(TCHAR));
RegSetValueEx(hk, _T("ClsidExtension"), 0, REG_SZ, (const BYTE*)_T("{29DE271C-7936-4C23-BD79-18F6AB7A4AA4}"), sizeof("{29DE271C-7936-4C23-BD79-18F6AB7A4AA4}") * sizeof(TCHAR));
RegCloseKey(hk);
COMクラスCObjectWithSite
ヘッダからツールバーのボタン登録部:
#ifndef __OBJECTWITHSITE_H__
#define __OBJECTWITHSITE_H__
#include <Ocidl.h>
#include <Exdisp.h>
class CObjectWithSite : public IObjectWithSite, public IOleCommandTarget
{
public:
// Constructor and destructor
CObjectWithSite();
virtual ~CObjectWithSite();
// IUnknown methods
STDMETHODIMP QueryInterface(REFIID riid,void** ppvObject);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IObjectWithSite methods
STDMETHODIMP SetSite(IUnknown* pUnkSite);
STDMETHODIMP GetSite(REFIID riid,void** ppvSite);
// IOleCommandTarget methods
STDMETHODIMP QueryStatus(const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText);
STDMETHODIMP Exec(const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut);
protected:
UINT m_uRefCount;
IWebBrowser2* m_pSite = nullptr; // the currently set site
IConnectionPoint* m_pCP = nullptr; // the active connection point interface
DWORD m_adviseCookie; // used by ConnectEventSink() and DisconnectEventSink() in conjunction with pCP
};
#endif // __OBJECTWITHSITE_H__