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__