如何在JavaScript中获取可以在浏览器外部传递的对象(COM)的引用

时间:2011-10-02 14:21:03

标签: javascript windows com mobile activex

我有一个hyrid类型的应用程序(网络和表单)。这是一个.net紧凑的框架应用程序。在其中一个表单上,我有一个WebBrowser控件。

我想在WebBrowser控件和托管/包含WebBrowser控件的表单之间进行通信。

为此,我计划在为Windows移动设备编译的C ++中创建一个Activex(COM)对象。

我计划使用JavaScript在WebBrowser控件中显示的网页上创建ActiveX控件的实例。

如何获取对此ActiveX控件的引用,然后我可以将其发送到表单?


我的目标是将ActiveX控件实例的引用发送到包含WebBrowser控件的Windows移动窗体,以便网页和窗体都可以使用/访问ActiveX控件的同一实例。

我创建了一种从ActiveX控件向表单发送字符串的方法。有没有办法将ActiveX控件的引用转换为字符串然后将字符串传递给窗体并在窗体端重新创建对象实例的引用?

我希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容获取对窗口的IDispatch引用:

CComPtr<IWebBrowser2> m_webBrowser(/* create, assign, whatever to get the pointer */
CComQIPtr<IHTMLWindow2> m_htmlWin;
CComPtr<IDispatch> m_htmlDocDisp;
CComQIPtr<IDispatch> m_htmlWindDisp;

m_webBrowser->get_Document(&m_htmlDocDisp);
CComQIPtr<IHTMLDocument2> doc(m_htmlDocDisp);
assert(doc);
doc->get_parentWindow(&m_htmlWin);
assert(m_htmlWin);

m_htmlWindDisp = m_htmlWin;
assert(m_htmlWin);

完成后,您可以使用IDispatch方法查询窗口对象上的属性值,也可以设置此类属性的值。例如,如果您创建一个公开方法和属性的IDispatch对象,那么您使用m_htmlWindDisp对象来调用对象为“foo”的PROPERTYPUTREF,然后您可以使用“window.foo”从javascript访问该对象。 Alternatley,使用带有PROPERTYGET的Invoke,您可以获取在窗口上设置的对象的IDispatch句柄,例如“window.foo = someFooBaredObject”

希望这是有道理的。