我创建一个浏览器助手对象使用VS2008,C ++。我的班级已经从IDispEventImpl的以及许多其他衍生

class ATL_NO_VTABLE CHelloWorldBHO :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
    public IObjectWithSiteImpl<CHelloWorldBHO>,
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}

从上面,我的DWebBrowserEvents2使用ATL的宏处理的代码显而易见。现在我想处理HTMLElementEvents2(检测点击,滚动条等),对于这一点,我的QueryInterface()的的IHTMLDocument2对象IHTMLElement,的QueryInterface()对于的IConnectionPointContainer并调用的IConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)。 (请参见上处理HTMLElementEvents2 MSDN的文章)。问题是,当我在我的课覆盖的IDispatch ::调用,该DWebBrowserEvents2手柄(使用ATL宏创建的)失败。有没有一种方法来处理HTMLElementEvents2而不覆盖调用,或实现援引这样一种方式,它只能处理HTMLElementEvents2?点击 谢谢,任何帮助将受到赞赏。

有帮助吗?

解决方案

有没有真正需要重写调用或获得的IConnectionPointContainer。由于这是一个ATL项目,实施另一IDispEventImpl的:

public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>

的伎俩。然后,水槽的条目为:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

在OnDocumentComplete,呼叫的IWebBrowser2 :: get_Document,的IHTMLDocument2 :: get_body,然后调用DispEventAdvise开始接收事件。

请注意,我用DIID_HTMLTextContainerEvents2代替DIID_HTMLElementEvents的。这是因为人体对象不支持HTMLElementEvents2,并为我的目的(处理滚动)这工作就好了!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top