【问题标题】:BHO Execute JavaScript on every pageBHO 在每个页面上执行 JavaScript
【发布时间】:2013-10-11 17:56:41
【问题描述】:

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

我知道,我需要在 OnDocumentComplete 之后执行 make,但我不知道,如何在 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 吗?

【问题讨论】:

  • 您能否就我们的答案提供反馈?

标签: c# c++ internet-explorer bho


【解决方案1】:

您正在寻找IHTMLWindow2::execScript

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

  1. 致电IWebBrowser2::get_Document()
  2. QueryInterface() 生成的 IDispatch 指向 IID_IHTMLDocument2 的指针。

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

这里有一些示例函数。您必须实现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;
}

【讨论】:

  • 我知道这种方法,但我不知道如何在 C++ 中使用它。在 C# 中更容易!
  • 好的,我更新了更多信息。如果您有更具体的问题,您可以发布您正在尝试做的事情,或者提出更具体的问题。
  • 我知道我要求为您编写代码 - 不太好。但是你能帮忙写代码吗?
【解决方案2】:

我在这里假设您已经有一个正在运行的 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;

}

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多