从BHO(C ++)在CAxWindow上公开JS的方法

时间:2013-10-01 00:30:55

标签: c++ internet-explorer com atl bho

我有这个BHO,我使用这个线程成功地将方法暴露给JS:Calling BHO method from Javascript?

当我打开CAxWindow以托管HTML文档时,我想使用这个导出的方法,但它似乎也不适用于该窗口。

我尝试制作一个自定义类,如:

class Bubble: 
public CAxWindow, 
public IDispEventImpl<1, Bubble, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>
{
public:

    BEGIN_SINK_MAP(Bubble)
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE , OnDocumentComplete) 
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE , OnDownloadComplete)
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_ONQUIT, OnQuit)
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATEERROR, NavigateError)           
        SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2 , OnNavigateComplete2)
    END_SINK_MAP()

尝试重复在文档完成时公开方法的过程,但似乎事件没有被触发。

基本上我的问题是:无论如何要在我的CAxWindow上向js公开方法吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

IDispEventImpl实现接收器接口以处理事件方法调用。您无法直接使用自己的其他方法扩展它。此外,JavaScript并没有真正从脚本代码中看到这个接口,因为它连接到ActiveX控件站点,而不是脚本引擎。 IDispEventImpl完全是IDispatch COM接口的简化实现,参考计数器空闲,适用于连接点接收器接口上的事件IDispatch::Invoke调用。

您需要实现一个带有IDispatch接口的类型库启用COM对象(脚本引擎使用类型库来发现实际方法),或者自定义IDispatchIDispatchEx接口实现(是的,这可以直接在CAxWindow类上实现,作为额外的基类/接口)处理方法名称解析而不使用类型库。然后,您将此对象作为external对象或其他方式传递给脚本引擎。