2016-08-16 11 views
0

auf Ich schreibe IE BHO, die aufgerufen werden muss, wenn IE-Symbolleistenschaltfläche geklickt wird. Ich habe funktionierende BHO, die DLL-Funktionen DllMain DllGetClassObject usw. auch COM-Klasse, die IObjectWithSite und IOleCommandTarget und Klasse der Fabrik implementiert, die IClassFactory implementiert. Ich weiß, dass es funktioniert, weil ich EventSinc verbunden hatte und es OnDocumentComplete und andere Ereignisse anruft.Rufen Sie BHO von der IE-Werkzeugleistenschaltfläche

Ich habe den Registrierungscode in DllRegisterServer Funktion und mit regsvr32.exe wurde es erfolgreich instaliert.

Jetzt wollte ich IE Toolbar Schaltfläche hinzufügen, die BHO-Funktionalität auf klicken würde, so habe ich diesen Artikel Adding Toolbar Buttons gefunden und Button-Registrierung zu meinem DllRegisterServer entsprechend hinzugefügt. Auch hinzugefügt IOleCommandTarget oben genannten com-Objekt und "implementiert" Exec-Methode mit Code, der in Datei schreibt (um zu überprüfen, ob Exec aufgerufen). Nachdem das Deinstallationsprogramm neu kompiliert und erneut installiert wurde, klicken Sie auf die Schaltfläche DllGetClassObject, die für den ersten Klick aufgerufen wird, und nichts passiert für alle aufeinander folgenden Klicks.

Also was kann falsch sein?

Schaltfläche Symbolleiste Registrierung Teil von 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-Klasse CObjectWithSite Header:

#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__ 

Antwort

0

auf die Schaltfläche Klicken Sie also dh Anrufe DllGetClassObject aus dem gleichen Thread, von dem DllGetClassObject wurde aufgerufen, wenn das heißt Tab erstellt. Er erstellt eine neue Instanz von bho und ruft IOleCommandTarget :: Exec auf. Wenn in DllGetClassObject versucht wird, das alte ClassFactory-Objekt der Schnittstelle abzufragen (wodurch auch das zuvor erstellte Objekt wiederverwendet wird), tritt ein Absturz auf. Es scheint also, dass beim Klicken auf die Schaltfläche eine neue Instanz von bho erstellt werden muss.