Re[2]: Редактирование скриптов в IWebBrowser2
От: sden1  
Дата: 28.01.04 10:31
Оценка:
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.