Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Addon для IE8 
:(
    Опции темы
Vicul
Дата 9.2.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Вообщем задача такая - надо пропарсить  HTML страницу на IE перед тем,
как она появится на глаза юзеру. 

Делаю эта так:

в созданном классе создаю обработку события DOWNLOADCOMPLETE,

Код


...
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2,  DISPID_DOWNLOADCOMPLETE, OnDownLoadComplete)
...

void STDMETHODCALLTYPE OnDownLoadComplete(VOID);
 

 Функцию для этого события реализую, так

Код

void STDMETHODCALLTYPE CIEaddonMonitor::OnDownLoadComplete(VOID)
{

   CComPtr<IDispatch> spDoc;
   HRESULT hr  = m_spWebBrowser->get_Document(&spDoc);
    long count = 0;

    if(SUCCEEDED(hr))
    {
        CComQIPtr<IHTMLDocument2> spHTMLDoc = spDoc;

        if(NULL != spHTMLDoc)
        {
            CComPtr <IHTMLElementCollection> pElementCollection;
            if (SUCCEEDED(spHTMLDoc->get_all(&pElementCollection)))
            {
                pElementCollection->get_length(&count);
                for(int i=0;i<count;i++)
                {
                    CComVariant svItemIndex(i);
                    CComVariant svEmpty;
                    CComPtr<IDispatch> spElement;
                    hr = pElementCollection->item(svItemIndex, svEmpty, &spElement);
                    if(SUCCEEDED(hr) && NULL != spElement)
                    {
                        CComQIPtr<IHTMLElement> spEl = spElement;
                        CComBSTR src;
                        hr = spEl->get_innerHTML(&src);
                         if(SUCCEEDED(hr))
                         {
                             CString str(src.m_str);
                                int index = str.Find(L"It works!");
                                if (index != -1)
                                {
                                    str.Insert(index, L"Addon: ");
                                    spEl->put_innerHTML(str.AllocSysString());
                                }
                         }
                    }
                }

            }
        }
    }

}
 

Там я получаю документ браузера spHTMLDoc, после определяю коллекцию HTML элементов  pElementCollection
и по ней в цикле анализирую каждый элемент на предмет нужного критерия (строка "It works"). Как только я его нахожу,
меняю содержимое его текста 

Код

                                    str.Insert(index, L"Addon: ");
                                    spEl->put_innerHTML(str.AllocSysString());
 

В принципе это работает, но когда я перебирал коллекцию pElementCollection, я обнаружил, что она содержит инфу не только
текущей загруженной страницы, но и кусок предыдущей страницы. Что мне не очень подходит. 
Поэтому вопрос есть ли способ получить инфу, только что загруженной страницы без всяких историй с предыдущих загрузок?

Любые идеи? 
  

PM MAIL   Вверх
Vicul
Дата 10.2.2011, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



Проблема решена через

Цитата

void STDMETHODCALLTYPE CIEaddonMonitor::OnDocumentComplete(IDispatch *pDisp, VARIANT *URL)
{
   CComPtr<IDispatch> spDoc;
   HRESULT hr  = m_spWebBrowser->get_Document(&spDoc);
    long count = 0;

    if(SUCCEEDED(hr))
    {
        CComQIPtr<IHTMLDocument2> spHTMLDoc = spDoc;

        if(NULL != spHTMLDoc)
     {
    CComBSTR currentURL;
    spHTMLDoc->get_referrer(&currentURL);
    CComPtr<IHTMLElement> pEl;
    if (SUCCEEDED(spHTMLDoc->get_body(&pEl)))
    {
    CComBSTR src;
    hr = pEl->get_innerHTML(&src);
     if(SUCCEEDED(hr))
     {
      CString str(L"\n");
      str.Append(src.m_str);
      str.Append(L"\n");
     int index = str.Find(L"It works!");
     if (index != -1)
     {
      str.Insert(index, L"Addon: ");
      pEl->put_innerHTML(str.AllocSysString());
     }
     }
    }

        }
    }


}



Тут возникает другой вопрос,  вот через put_innerHTML() я отрихтовал страницу, но если сделать Refresh - она восстановиться с кеша.
Поэтому вопрос - как добраться до кеша? 


Это сообщение отредактировал(а) Vicul - 10.2.2011, 14:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.