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

tt9*_*tt9 6 javascript c++ windows com

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

HRESULT hr = CoCreateInstance(
            CLSID_InternetExplorer,
            NULL,
            CLSCTX_LOCAL_SERVER,
            IID_IWebBrowser2,
            (void**)&_cBrowser);
Run Code Online (Sandbox Code Playgroud)

我还有一个"拥有"从该函数返回的IWebBrowser2对象的类.

class BrowserWrapper{
    public: 
        CComPtr<IWebBrowser2> pBrowser;

        void SomeFunction(...)
}
Run Code Online (Sandbox Code Playgroud)

有没有办法从生成的IWebBrowser2对象中的JavaScript中调用包装类中的"SomeFunction"这样的函数?

Sim*_*ier 5

您必须实现IDocHostUIHandler接口并使用与此类似的代码(从doc中提取)将其设置为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());
    }
} 
Run Code Online (Sandbox Code Playgroud)

您必须专门实现GetExternal方法

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

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

您在GetExternal什么样的回报必须是一个IDispatch对象,你可以设计你想要的方式.