我正在为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吗?
答案 0 :(得分:1)
您正在寻找IHTMLWindow2::execScript。
您可以通过执行以下操作获取IHTMLDocument2
指针:
IWebBrowser2::get_Document()
。IDispatch
的{{1}}指针。您应该能够通过调用IID_IHTMLDocument2
对象上的get_parentWindow
并进行类似的舞蹈来获取IHTMLWindow2指针。
以下是一些示例函数。您必须实现IHTMLDocument2
并缓存您的站点指针。您可以将其传递给这些函数。
IObjectWithSite
答案 1 :(得分:0)
我想这里你已经有一个正在运行的BHO并且它处理OnDocumentComplete。我还假设您对OnDocumentComplete的处理为您提供了一个IWebBrowser2接口指针。如果情况不是这样,请告诉我。
警告:错误检查“perfectible”。
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;
}