Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Browser Helper Object  (Прочитано 11174 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Tomek
Гость
« : 28-06-2005 13:29 » 

Доброго времени суток.
Мне нужно написать BHO, который должен подменить страницу HTML, которую пользователь загрузил на другую (скажем на ту же, только без определенных тегов или с подмененными адресами). Решил использовать ATL, немного почитал документацию, полазил по форумам и вот в чем проблема. В Invoke на dispidMember==DISPID_DOWNLOADCOMPLETE вызываю функцию OnDocumentComplete:


Код:
HRESULT CSuperHook::OnDocumentComplete(){
  USES_CONVERSION;
  CComPtr<IDispatch> pDisp;
  HRESULT hr=m_spBrowser->get_Document(&pDisp);
  CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2> pHTML;
  pHTML=pDisp;
  if (pHTML){
      hr=pHTML->get_body(&m_body);
      if (FAILED(hr))
          return hr;   
        BSTR strHTML;
      hr=m_body->get_innerHTML(&strHTML); // возвращаем html страницу
      hr=Parse(&strHTML,_T("<TR>"),_T("<a href='http://www.rsdn.ru/'>rsdn.РУ</a>")); // функция для парсинга HTML страницы (см. ниже)
     
      hr=m_body->put_innerHTML(strHTML); // запись измененной HTML-страницы     
      ::SysFreeString(strHTML);
  }
  return S_OK;
}

Функция Parse принимает в качестве параметров исходную HTML-ку , текст для замены и на что заменить :

Код:
HRESULT CSuperHook::Parse(BSTR *source,LPTSTR strSearch,LPTSTR strReplace){  
   USES_CONVERSION;
   int strSourceLen=SysStringLen(*source);
   int strSearchLen=_tcslen(strSearch);
   int strReplaceLen=_tcslen(strReplace);
   LPTSTR strSource = new TCHAR[strSourceLen+1];
   LPTSTR strNew = new TCHAR[strSourceLen+4000];
   
   _tcscpy(strSource, OLE2T(*source));
   LPTSTR token,pPrevPos=strSource;
   int posSource=0,posNew=0;
   while ((token=_tcsstr(strSource+posSource,strSearch))!=NULL){     
     _tcsncpy(strNew+posNew,strSource+posSource,token-pPrevPos);
     posSource+=token-pPrevPos+strSearchLen;     
     posNew+=token-pPrevPos;
     _tcsncpy(strNew+posNew,strReplace,strReplaceLen);         
     pPrevPos=token+strSearchLen;
     posNew+=strReplaceLen;     
   }
   token=strSource+_tcslen(strSource);
   _tcsncpy(strNew+posNew,strSource+posSource,token-pPrevPos);
   posNew+=token-pPrevPos;
   strNew[posNew]='\0';
   
   ::SysFreeString(*source);   
   *source=::SysAllocString(T2OLE(strNew));     
   delete [] strSource;
   delete [] strNew;
   return S_OK;   
}

Итак, теперь при загрузке страницы в IE (по окончании загрузки), в самом окне браузера в местах, где были элементы <TR> мы увидим ссылки "rsdn.РУ", клацая по которым перейдем на http://www.rsdn.ru. Вроде все верно, но САМ HTML код страницы (если посмотреть в View->Source в главном меню IE) не изменился. Вопрос : ПОЧЕМУ ?
Далее, когда я начну обновлять несколько раз минимальную страницу, после двух-трех обновлений мой Outpost выдает предупреждение, что DEVENV.EXE (я отлаживаю с брейкпоинтами) пытается записать код в IE. Далее вываливается ошибка из модуля strcat.asm............ В общем, переполнение буфера, но почему это происходит, я понять не могу — вроде память везде освобождается.
И вообще, может кто знает способ как можно проще это все сделать или у кого-то уже есть наработки в этой сфере ?
Спасибо всем за внимание.
« Последнее редактирование: 15-12-2007 19:27 от Алексей1153++ » Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #1 : 11-07-2005 15:25 » new


Итак, теперь при загрузке страницы в IE (по окончании загрузки), в самом окне браузера в местах, где были элементы <TR> мы увидим ссылки "rsdn.РУ", клацая по которым перейдем на http://www.rsdn.ru. Вроде все верно, но САМ HTML код страницы (если посмотреть в View->Source в главном меню IE) не изменился. Вопрос : ПОЧЕМУ ?


На этот вопрос я могу ответить. По View->Source IE отображаетв текстовом режиме содержимое html файла сохраненного в кэш директории на диске, а вовсе не то, что содержится в памяти, и он отбражает как браузер. Так что все изменения, сделанные "влет" в этом режиме просто не будут видны.
С памятью не столь очевидно. Непонятно, зачем связываться с TCHAR, а не просто использовать строковые функции для WCHAR.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines