在BHO(C ++)的CAxWindow上向JS展示方法 [英] Exposing methods to JS on a CAxWindow from a BHO ( C++ )

查看:352
本文介绍了在BHO(C ++)的CAxWindow上向JS展示方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个BHO,我成功地暴露方法从JS使用此线程:调用BHO方法从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 ,DIID_DWebBrowserEvents2,DISPID_NAVIGATECOMPLETE2,OnNavigateComplete2)
END_SINK_MAP()

要尝试重复曝光过程在文档完成的方法,但似乎事件没有被激发。



所以基本上我的问题是:有没有暴露方法到我的CAxWindow的js? / p>

非常感谢!

解决方案

IDispEventImpl 实现sink接口来处理事件方法调用。您不能直接使用您自己的附加方法扩展它。此外,JavaScript并不真正从脚本代码看到此接口,因为它连接到ActiveX控制站点,而不是脚本引擎。 IDispEventImpl 是所有简化的实现 IDispatch COM接口,引用计数器,适用于事件



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


I have this BHO which I successfully exposed method to JS from it using this thread: Calling BHO method from Javascript?.

When I open a CAxWindow in order to host HTML docs, I'd like to use this exported method but it seems that it doesn't work for that window as well.

I tried to make a custom class like:

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()

To try repeat the process of exposing the methods on document complete but it seems that the event is not being fired.

So basically my question is: is there anyway to expose methods to js on my CAxWindow?

Many thanks!

解决方案

IDispEventImpl implements sink interface to handle event methods calls. You cannot extend it with your own additional methods directly. Additionally, JavaScript does not really see this interface from scripting code because it is connected to ActiveX control site, not the scripting engine. IDispEventImpl is at all a simplified implementation of IDispatch COM interface, reference counter free, suitable for event IDispatch::Invoke call on the connection point sink interface.

You need to either implement a type library enabled COM object with IDispatch interface (type library is used by scripting engine to discover actual methods), or custom IDispatch or IDispatchEx interface implementation (yes, this can be implemented directly on CAxWindow class as additional base class/interface) handling method name resolution without type library. Then you will pass this object to the scripting engine as external object or otherwise.

这篇关于在BHO(C ++)的CAxWindow上向JS展示方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆