2016-08-16 5 views
0

IEツールバーボタンがクリックされたときに呼び出されるIE BHOを書いています。 IObjectWithSiteIOleCommandTargetを実装する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__ 

答えて

0

、ボタンの上すなわちをクリックしているDllGetClassObjectは、すなわち、タブと呼ばれていたのと同じスレッドからいるDllGetClassObjectを呼び出します作成した。 bhoの新しいインスタンスを作成し、IOleCommandTarget :: Execを呼び出します。 DllGetClassObjectで古いクラスのClassFactoryオブジェクト(以前に作成されたオブジェクトを再利用する)を照会しようとすると、クラッシュが発生します。ボタンをクリックすると、bhoの新しいインスタンスが作成されているようです。

関連する問題