使用Javascript在Internet Explorer中调用C ++

我已经看到了BHO扩展,JavaScript可以在C ++ BHO中调用函数。 但是让我说我​​不使用BHO,而是我有一个C ++控制台应用程序,创build一个IE COM对象,如下所示:

HRESULT hr = CoCreateInstance( CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&_cBrowser); 

我也有一个类“拥有”从这个函数返回的IWebBrowser2对象。

 class BrowserWrapper{ public: CComPtr<IWebBrowser2> pBrowser; void SomeFunction(...) } 

有没有办法从生成的IWebBrowser2对象中的JavaScript调用封装类中的“SomeFunction”函数?

您必须实现IDocHostUIHandler接口,并使用类似于此的代码(从文档中提取)将其设置为Web浏览器:

 ComPtr<IDispatch> spDocument; hr = spWebBrowser2->get_Document(&spDocument); if (SUCCEEDED(hr) && (spDocument != nullptr)) { // Request default handler from MSHTML client site ComPtr<IOleObject> spOleObject; if (SUCCEEDED(spDocument.As(&spOleObject))) { ComPtr<IOleClientSite> spClientSite; hr = spOleObject->GetClientSite(&spClientSite); if (SUCCEEDED(hr) && spClientSite) { // Save pointer for delegation to default m_spDefaultDocHostUIHandler = spClientSite; } } // Set the new custom IDocHostUIHandler ComPtr<ICustomDoc> spCustomDoc; if (SUCCEEDED(spDocument.As(&spCustomDoc))) { // NOTE: spHandler is user-defined class spCustomDoc->SetUIHandler(spHandler.Get()); } } 

您必须具体实现GetExternal方法

现在,在IE的JavaScript(或者VBScript)中,你可以通过这样的调用来访问你的主机:

 var ext = window.external; // this will call your host's IDocHostUIHandler.GetExternal method ext.SomeFunction(...); // implemented by your object 

你在GetExternal中返回的内容必须是一个IDispatch对象,你可以设计你想要的方式。

您需要实现IDocHostUIHandler接口。 这有一个名为GetExternal的方法 – 您需要返回一个实现IDispatch的对象。

在JavaScript中,您可以调用window.external.something() – 这将导致浏览器查询您的外部实现IDispatch对象 – 然后它将使用IDispatch执行something