我正在编写IE BHO来处理C ++中的按钮单击事件。 其他事件处理得很好,但仅适用于HTMLButtonElementEvents, 当我单击按钮时,msgbox可以显示,但是当我单击OK时,调试断言在atlcom.h第4790行失败。提示是 表达式:((HRESULT)(hr))= 0 我打开了那个文件,看到它的DispCallFunc函数出现了真正的问题。 任何人都可以帮我弄清楚我的代码出了什么问题?非常感谢。
主要代码如下:
class CMyClass:
// Some base classes
, public IDispEventImpl<1, CMyClass, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
, public IDispEventImpl<2, CMyClass, &DIID_HTMLButtonElementEvents, &LIBID_MSHTML, 4, 0>
{
typedef IDispEventImpl<1, CMyClass, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> SinkImplDWebBrowser;
typedef IDispEventImpl<2, CMyClass, &DIID_HTMLButtonElementEvents, &LIBID_MSHTML, 4, 0> SinkImplHTMLElement;
BEGIN_SINK_MAP(CMyClass)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
SINK_ENTRY_EX(2, DIID_HTMLButtonElementEvents, DISPID_HTMLELEMENTEVENTS2_ONCLICK, OnHtmlElementClick2)
END_SINK_MAP()
void STDMETHODCALLTYPE OnDocumentComplete2(IDispatch *pDisp, VARIANT *pvarURL)
{
// ...
// Finded the button i care that is "CComQIPtr<IHTMLButtonElement> spButton"
HRESULT hr = SinkImplHtmlElement::DispEventAdvise(spButton);
}
void STDMETHODCALLTYPE OnHtmlElementClick2(IHTMLElementObj *pElement)
{
MessageBox(NULL, _T("Button Clicked!!"), IDOK);
}
}