Доброго времени суток.
Мне нужно написать 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............ В общем, переполнение буфера, но почему это происходит, я понять не могу — вроде память везде освобождается.
И вообще, может кто знает способ как можно проще это все сделать или у кого-то уже есть наработки в этой сфере ?
Спасибо всем за внимание.