0

我正在为 Internet Explorer (BHO) 编写扩展程序。我阅读了许多问题和答案,但无法找到并理解,如何从每个页面的资源中执行 Javascript 文件?不附加网页,需要在每个页面上执行必要的 JS。

我知道,我需要在 OnDocumentComplete 之后执行,但我不知道,如何在 C++ 中执行此操作...我找到了这个扩展,但它是用 C# 编写的,我无法将其转换为 C++。:

https://github.com/dvdotsenko/livereload_ie_extension

我有 C++ 中的示例 BHO:http: //www.codeproject.com/Articles/37044/Writing-a-BHO-in-Plain-C

你能帮我从每个页面的资源中添加执行 JavaScript 吗?

4

2 回答 2

1

您正在寻找IHTMLWindow2::execScript

您可以IHTMLDocument2通过执行以下操作来获取指针:

  1. 打电话IWebBrowser2::get_Document()
  2. QueryInterface() 的结果IDispatch指针IID_IHTMLDocument2

您应该能够通过调用对象并执行类似get_parentWindow的操作来获取 IHTMLWindow2 指针。IHTMLDocument2

下面是一些示例函数。您必须实现IObjectWithSite并缓存您的站点指针。您可以将其传递给这些函数。

HRESULT Web2FromSite(IUnknown *punkSite, IWebBrowser2 **pWeb2) {
    IServiceProvider* psp;
    HRESULT hr = punkSite->QueryInterface(IID_IServiceProvider, (void **)&psp);
    if (SUCCEEDED(hr))
    {
        hr = psp->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void **)pWeb2);
        psp->Release();
    }
    return hr;
}

HRESULT Doc2FromWeb2(IWebBrowser2 *pWeb2, IHTMLDocument2 **ppDoc2) {
    CComPtr<IDispatch> spDisp;
    HRESULT hr = pWeb2->get_Document(&spDisp);
    if (SUCCEEDED(hr) && spDisp)
    {
        hr = spDisp->QueryInterface(IID_IHTMLDocument2, (void**)ppDoc2);
    } else {
        hr = E_FAIL;
    }
    return hr;
}

HRESULT Doc2FromSite(IUnknown *punkSite, IHTMLDocument2 **ppDoc2) {
    CComPtr<IWebBrowser2> spWeb2;
    HRESULT hr = Web2FromSite(punkSite, &spWeb2);
    if (SUCCEEDED(hr)) {
        hr = Doc2FromWeb2(spWeb2, ppDoc2);
    }
    return hr;
}
于 2013-10-04T16:43:06.550 回答
0

我在这里假设您已经有一个正在运行的 BHO 并且它处理 OnDocumentComplete。我还假设您对 OnDocumentComplete 的处理会为您提供一个 IWebBrowser2 接口指针。如果不是这样,请告诉我。

警告:错误检查“完美”。

HRESULT ExecScriptOnDocComplete(  CComPtr<IWebBrowser2> & spIWebBrowser2, BSTR bstrScriptToExec ) {

    // get the IHTMLDocument2
    CComPtr<IDispatch> spIDispatchDocument;
    HRESULT hr = spIWebBrowser2->get_Document( &spIDispatchDocument );
    if ( FAILED( hr ) ) return hr;
    CComPtr<IHTMLDocument2> spIHTMLDocument2;
    hr = spIDispatchDocument.QueryInterface<IHTMLDocument2>( &spIHTMLDocument2 );
    if ( FAILED( hr ) ) return hr;

    // get the IHTMLWindow2
    CComPtr<IHTMLWindow2> spIHTMLWindow2;
    hr = spIHTMLDocument2->get_parentWindow( &spIHTMLWindow2 );
    if ( FAILED( hr ) ) return hr;

    // Execute the script
    CComVariant ccomvariantRetVal;
    hr = spIHTMLWindow2->execScript( bstrScriptToExec, CComBSTR( L"JavaScript" ), &ccomvariantRetVal );

    return hr;

}
于 2013-10-21T08:37:55.977 回答