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

发布于 2024-12-07 22:42:32 字数 517 浏览 1 评论 0原文

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

我想在 WebBrowser 控件和承载/包含 WebBrowser 控件的窗体之间进行通信。

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

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

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


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

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

我希望这是有道理的。

I have a hyrid type application (web and forms). It's a .net compact framework app. On one of the forms I have a WebBrowser control.

I want to communicate between the WebBrowser control and the form that host/contains the WebBrowser control.

To do this I plan to create an Activex (COM) object in C++ compiled for the windows mobile device.

I plan to use JavaScript to create an instance of the ActiveX control on the web page that is displayed in the WebBrowser control.

How can I get a reference to this ActiveX control that I can then send to the form?


My objective is to send a reference of the ActiveX control instance to the windows mobile form that contains the WebBrowser control so that both the web page and form can use/access the same instance of the ActiveX control.

I created a way to send strings from the ActiveX control to the form. Is there a way to convert a reference of the ActiveX control to a string then pass the string to the form and re-create a reference to the object instance on the form side?

I hope this makes sense.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

写给空气的情书 2024-12-14 22:42:32

您可以使用如下方式获取对窗口的 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 对象以 PROPERTYPUTREF 作为“foo”来调用该对象,那么您可以使用“window.foo”从 javascript 访问该对象。或者,使用带有 PROPERTYGET 的 Invoke,您可以获得在窗口上设置的对象的 IDispatch 句柄,例如“window.foo = someFooBaredObject”

希望这是有道理的。

You can get an IDispatch reference to the window using something like this:

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

Once you have that, you can use IDispatch methods to either query the value of a property on the window object or you can set the value of such a property. For example, if you create an IDispatch object that exposes methods and properties then you use the m_htmlWindDisp object to Invoke with PROPERTYPUTREF that object as "foo" then you could access that object from javascript using "window.foo". Alternatley, using Invoke with PROPERTYGET you can get the IDispatch handle for an object that you set on window, such as "window.foo = someFooBaredObject"

Hope that makes sense.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文