Я пишу расширение для Internet Explorer (BHO).
Я прочитал много вопросов, ответов, но не могу найти и понять, как заставить файл Javascript выполнять с ресурса на каждой странице? Не добавлять веб-страницу, нужно обязательно выполнить JS на каждой странице.
Я знаю, что мне нужно сделать выполнить после OnDocumentComplete, но я не могу знать, как это сделать в C ++ …
Я нашел это расширение, но оно написано на C #, и я не могу преобразовать его в C ++ .:
https://github.com/dvdotsenko/livereload_ie_extension
У меня есть пример BHO в C ++:
http://www.codeproject.com/Articles/37044/Writing-a-BHO-in-Plain-C
Можете ли вы помочь мне добавить исполняемый JavaScript из ресурса на каждую страницу?
Ты ищешь IHTMLWindow2 :: execScript.
Вы можете получить IHTMLDocument2
указатель, выполнив следующее:
IWebBrowser2::get_Document()
,IDispatch
указатель для IID_IHTMLDocument2
,Вы должны быть в состоянии получить указатель IHTMLWindow2, вызвав get_parentWindow
на 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;
}
Здесь я предполагаю, что у вас уже есть работающий 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;
}