【发布时间】:2021-03-09 06:32:59
【问题描述】:
我使用 ATL C++ 创建了一个 Com 对象
interface IHostObjectSample2 : IDispatch
{
[propget, id(2), helpstring("Property.")] HRESULT Property([out, retval] BSTR* stringResult);
[propput, id(2), helpstring("Property.")] HRESULT Property([in] BSTR stringValue);
};
dispinterface _IHostObjectSample2Events
{
methods:
[id(1), helpstring("message")] void Event();
};
coclass HostObjectSample2
{
[default] interface IHostObjectSample2;
[default, source] dispinterface _IHostObjectSample2Events;
};
我使用 AddHostObjectToScript 将 Com 对象添加到脚本
m_Webview->AddHostObjectToScript(L"sample", &remoteObjectAsVariant));
我可以从脚本端调用方法/函数
我想在 c++ 端触发事件 _IHostObjectSample2Events::Event 并在 Javascript 端接收它
类似 window.chrome.webview.hostObjects.sample.addEventListener("Event", () => { do something });
【问题讨论】:
-
这没有记录,我怀疑如果它被实现就不会是因为它是一个非常复杂的机制(IConnectionPoint,需要 COM 消息泵等)。只有微软可以回答这个问题(我看到这里已经发布了这个问题github.com/MicrosoftEdge/WebView2Feedback/issues/677)
-
它不适用于 IE 脚本,我预计连接点也不会使用 webview2 实现。
-
您可以简单地从 C++ 调用:
WebView2.ExecuteScriptAsync(String)并调用普通的 javascriptfunction。 -
@RomanR。它与 IE 一起使用,这里的示例 codeproject.com/Articles/35532/… 像这样:
-
那我就更正了。然而,IE11 也支持从 C++ 端提供回调接口的不同方法。我认为这就是 WebView2 的工作原理。不确定是否打算支持老化的连接点机制。
标签: javascript com atl webview2