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

Posted

技术标签:

【中文标题】从 BHO ( C++ ) 在 CAxWindow 上向 JS 公开方法【英文标题】:Exposing methods to JS on a CAxWindow from a BHO ( C++ ) 【发布时间】:2013-10-07 00:24:52 【问题描述】:

我有这个 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】:

IDispEventImpl 实现 sink 接口来处理事件方法调用。你不能直接用你自己的附加方法来扩展它。此外,JavaScript 并没有真正从脚本代码中看到这个接口,因为它连接到 ActiveX 控制站点,而不是脚本引擎。 IDispEventImpl完全是IDispatchCOM接口的简化实现,无引用计数器,适用于连接点sink接口上的事件IDispatch::Invoke调用。

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

【讨论】:

以上是关于从 BHO ( C++ ) 在 CAxWindow 上向 JS 公开方法的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Visual Studio 2010 调试 C++ BHO DLL

从 Javascript 调用 BHO 方法?

制作一个属于自己的BHO吧!(C#)

Inno Setup卸载时注销bho

利用BHO实现浏览器劫持

在BHO中处理JavaScript生成的页面