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

Using Javascript to Call C++ in Internet Explorer

我在 BHO 扩展中看到了这一点,其中 JavaScript 可以调用 C++ BHO 中的函数。但是可以说我没有使用 BHO,而是我有一个 C++ 控制台应用程序,它创建一个 IE COM 对象,如下所示:

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

我还有一个 class,其中 "owns" 从该函数返回的 IWebBrowser2 对象。

class BrowserWrapper{
    public: 
        CComPtr<IWebBrowser2> pBrowser;

        void SomeFunction(...)
}

有没有办法从派生的 IWebBrowser2 对象中的 JavaScript 调用包装器 class 中的 "SomeFunction" 之类的函数?

您必须实施 IDocHostUIHandler interface 并使用类似于此的代码(从文档中提取)将其设置到网络浏览器:

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 method

现在,在 IE 的 javascript(或 vbscript)中,您可以通过这样的调用访问您的主机:

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

您在 GetExternal return 中 必须是 一个 IDispatch 对象,您可以按照自己的方式进行设计。

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

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