Здравствуйте, Flamer, Вы писали:
Добавить-то скрипт не проблема, а вот заменить/удалить существующий никак не получается

. Вернее, оно, вроде как и получается, но оригинальный скрипт все равно срабатывает раньше, чем OnDocumentComplete или OnDownloadComplete.
На данный момент я прорабатываю 2 способа решения этой проблемы:
1. как-то получить доступ к "чистому", только скаченному HTML (можно ли как-то назначить своему IWebBrowser свой, отдельный прокси?)
2. как-то подменить window.confirm своей функцией на С. Я где-то встречал пример такого кода, может, кто знает?
F>Здравствуйте, sden1, Вы писали:
F>[]
S>>webbrowser, так что BHO, наверно, не подойдет. Редактирование скриптов при помощи IHTMLDocument2:get_scripts() не помогает,
S>>тк оригинальные скрипты срабатывают в любом случае.
F>Почему не помогает? В принципе должно... вызываете get_scripts, для каждого элемента коллекции запрашиваете IHTMLScriptElement*, у него вызываете get_text, сохраняете это текст, вызываете put_text с параметром L"function () {}" (или что-то подобное). Сохраненный текст анализируете/изменятете, потом делаете нечто вроде:
F>F>void AddScript(IHTMLDocument2* pDoc)
F>{
F>ATLTRACE("AddScript\n");
F>ATLASSERT(pDoc);
F> char* scripttext="script";
F> IHTMLElement* pBodyElem = GetBody(pDoc);
F> HRESULT hr;
F> if(pBodyElem)
F> {
F> IHTMLElement* pScript = NULL;
F> BSTR bstrScriptText = _com_util::ConvertStringToBSTR(scripttext);
F> if(bstrScriptText)
F> {
F> hr = pDoc->createElement(bstrScriptText,&pScript);
F> ::SysFreeString(bstrScriptText);
F> if(SUCCEEDED(hr) && pScript)
F> {
F> CComQIPtr<IHTMLDOMNode,&IID_IHTMLDOMNode> pDocDOM(pBodyElem);
F> if(pDocDOM != NULL)
F> {
F> CComQIPtr<IHTMLDOMNode,&IID_IHTMLDOMNode> pHiddenDOM(pScript);
F> CComQIPtr<IHTMLScriptElement,&IID_IHTMLScriptElement> pScriptEl(pHiddenDOM);
F> if(pScriptEl != NULL)
F> {
F> BSTR bstrScriptText2 =
F>_com_util::ConvertStringToBSTR("function hello_world() { alert('Hello, world!');}");
F> if(bstrScriptText2)
F> {
F> pScriptEl->put_text(bstrScriptText2);
F> ::SysFreeString(bstrScriptText2);
F> }
F> } // if(pScriptEl != NULL)
F> if(pHiddenDOM != NULL)
F> {
F> IHTMLDOMNode* pAddedNode = NULL;
F> hr = pDocDOM->appendChild(pHiddenDOM,&pAddedNode);
F> if(SUCCEEDED(hr) && pAddedNode)
F> pAddedNode->Release();
F> } // if(pHiddenDOM != NULL)
F> } // if(pDocDOM != NULL)
F> pScript->Release();
F> } // if(SUCCEEDED(hr) && pScript)
F> } // if(bstrScriptText)
F> pBodyElem->Release();
F> } // if(SUCCEEDED(hr) && pBodyElem)
F>}
F>//---------------------------------------------------------------------------
F>
F>Все это лучше делать на OnDocumentComplete.