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

Using Javascript to Call C++ in Internet Explorer

本文关键字:Javascript 调用 C++ Internet Explorer      更新时间:2023-10-16

我已经在BHO扩展中看到了这一点,其中JavaScript可以在C++BHO中调用函数。但是假设我没有使用 BHO,而是我有一个C++控制台应用程序,它创建了一个 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