void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, TVariant *URL)
{
Memo1->Lines->Add("DocumentComplete"); // trace
TComInterface<IWebBrowser2> pBrowser;
if(SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2,(LPVOID*)&pBrowser))/* && pBrowser*/)
{
Memo1->Lines->Add("QueryInterface SUCCEEDED"); // trace
WideString wsURL;
pBrowser->get_LocationURL(&wsURL);
Memo1->Lines->Add("LocationURL - " + wsURL); // trace
}
else
Memo1->Lines->Add("QueryInterface FAIL"); // trace
}
CppWebBrowser и фреймы
Есть страничка на ней 5 фреймов, срабатывает событие ОнДокументКомплет, как узнать какой из фреймов обновился? Или точнее, как отлавливать обновление определенного фрейма?
Призагрузке страницы в каждый фреймик добавляю пару тегов в виде комментария
Код:
pBody->insertAdjacentText (
L"AfterEnd",L"<!-- PREVED MEDVED KRASAVCHEG -->");
L"AfterEnd",L"<!-- PREVED MEDVED KRASAVCHEG -->");
На данный способ почему-то не работает =(....
Когда срабатывает событие OnDocumentComplete остается только проверить фреймы - в каком фрейме нет такой красоты, тот значит обновился.
Может кто подскажет как воткнуть кусок кода в HTML файл?
...
Код:
pBody->insertAdjacentText (
L"AfterEnd",L"<!-- PREVED MEDVED KRASAVCHEG -->");
L"AfterEnd",L"<!-- PREVED MEDVED KRASAVCHEG -->");
На данный способ почему-то не работает =(....
[/QUOTE]
Не работает в каком смысле? Не добавляются комментарии? Приведи полный код пожайлуста, так не поймешь чего не работает.
[QUOTE=newcss]
Может кто подскажет как воткнуть кусок кода в HTML файл?[/QUOTE]
HTMLDocument2::write()
IHTMLDocument2::createElement()
как у тебя тоже можно...
А вообще что у нас есть фрейм? Броузер в документе или документ в документе?
Нахожу нужный фрейм....
Код:
IHTMLWindow2 *pWindow = NULL;
....
IHTMLDocument2 *iDoc_logo=NULL;
// передаем управление к IHTMLDocument2
pWindow->get_document(&iDoc_logo);
IHTMLElement *pBody=NULL;
iDoc_logo->get_body(&pBody);
if(pBody!=NULL)
{
wchar_t *T,*uk;
T=NULL;
uk=NULL;
pBody->get_innerHTML(&T);
if(T!=NULL)uk=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL)
{
ShowMessage("Фреймик старый");
}
else
{
// вставляем кусочек кода в ШТМЛ
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
ShowMessage("Фрейм обновлен");
}
....
IHTMLDocument2 *iDoc_logo=NULL;
// передаем управление к IHTMLDocument2
pWindow->get_document(&iDoc_logo);
IHTMLElement *pBody=NULL;
iDoc_logo->get_body(&pBody);
if(pBody!=NULL)
{
wchar_t *T,*uk;
T=NULL;
uk=NULL;
pBody->get_innerHTML(&T);
if(T!=NULL)uk=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL)
{
ShowMessage("Фреймик старый");
}
else
{
// вставляем кусочек кода в ШТМЛ
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
ShowMessage("Фрейм обновлен");
}
Вот этот кусок кода срабатывает каждый раз когда срабатывает событие OnDocumentComplete
но почему-то не работает
Код:
pBody->insertAdjacentText (L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
L"<!-- ТЕСТ_ФРЕЙМ -->");
Каждый раз пишет
Код:
ShowMessage("Фрейм обновлен");
Пробовал посмотреть на результат, после инъекции ШТМЛ текста получал содержимое ШТМЛ заново но там нет
Код:
<!-- ТЕСТ_ФРЕЙМ -->
Код:
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
pBody->get_innerHTML(&T);
if(T!=NULL)
k=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL) {
ShowMessage("Фреймик старый");
}
L"<!-- ТЕСТ_ФРЕЙМ -->");
pBody->get_innerHTML(&T);
if(T!=NULL)
k=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL) {
ShowMessage("Фреймик старый");
}
Код:
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
pBody->get_innerHTML(&T);
if(T!=NULL)
k=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL) {
ShowMessage("Фреймик старый");
}
L"<!-- ТЕСТ_ФРЕЙМ -->");
pBody->get_innerHTML(&T);
if(T!=NULL)
k=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL) {
ShowMessage("Фреймик старый");
}
Неа =( не работает =(
Нахожу нужный фрейм....
Код:
IHTMLWindow2 *pWindow = NULL;
....
IHTMLDocument2 *iDoc_logo=NULL;
// передаем управление к IHTMLDocument2
pWindow->get_document(&iDoc_logo);
IHTMLElement *pBody=NULL;
iDoc_logo->get_body(&pBody);
if(pBody!=NULL)
{
wchar_t *T,*uk;
T=NULL;
uk=NULL;
pBody->get_innerHTML(&T);
if(T!=NULL)uk=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL)
{
ShowMessage("Фреймик старый");
}
else
{
// вставляем кусочек кода в ШТМЛ
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
ShowMessage("Фрейм обновлен");
}
....
IHTMLDocument2 *iDoc_logo=NULL;
// передаем управление к IHTMLDocument2
pWindow->get_document(&iDoc_logo);
IHTMLElement *pBody=NULL;
iDoc_logo->get_body(&pBody);
if(pBody!=NULL)
{
wchar_t *T,*uk;
T=NULL;
uk=NULL;
pBody->get_innerHTML(&T);
if(T!=NULL)uk=wcsstr(T,L"ТЕСТ_ФРЕЙМ");
if(uk!=NULL)
{
ShowMessage("Фреймик старый");
}
else
{
// вставляем кусочек кода в ШТМЛ
pBody->insertAdjacentHTML(L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
ShowMessage("Фрейм обновлен");
}
Вот этот кусок кода срабатывает каждый раз когда срабатывает событие OnDocumentComplete
но почему-то не работает
Код:
pBody->insertAdjacentText (L"AfterEnd",
L"<!-- ТЕСТ_ФРЕЙМ -->");
L"<!-- ТЕСТ_ФРЕЙМ -->");
Каждый раз пишет
Код:
ShowMessage("Фрейм обновлен");
Пробовал посмотреть на результат, после инъекции ШТМЛ текста получал содержимое ШТМЛ заново но там нет
Код:
<!-- ТЕСТ_ФРЕЙМ -->
1. я конечно не тормоз могу и домыслить, но ты уж пожайлуста не напрягай меня:) Я в отпуске мозги плавятся, пиво каждый день... Как и где получил IHTMLWindow2?
2. Я сейчас соображаю плохо по причине указанной выше, но почему бы не сделать так:
Код:
Ведь OnДокументКомплит происходит для каждого фрейма и по УРЛ можно опознать нужный, а?
---------------------
Спустя 15 мин:
Хы =) классс =) пасиб =) помогло.
Код:
TComInterface<IWebBrowser2> pBrowser;
Чтобы использовать TComInterface, какой нужен компонент???? А то если просто так писать ругается =(
Код:
TComInterface<IWebBrowser2> pBrowser;
Чтобы использовать TComInterface, какой нужен компонент???? А то если просто так писать ругается =([/QUOTE]
#include <utilcls.h>
можешь и без него обойтись:
Код:
IWebBrowser2* pBrowser;
pDisp->QueryInterface(IID_IWebBrowser2,(LPVOID*)&pBrowser))
... //use
pBrowser->Release();
pDisp->QueryInterface(IID_IWebBrowser2,(LPVOID*)&pBrowser))
... //use
pBrowser->Release();
, то [COLOR=#000000]pBrowser->Release(); писать ненадо?[/COLOR][/COLOR][/COLOR]
, то [COLOR=#000000]pBrowser->Release(); писать ненадо?[/COLOR][/COLOR][/COLOR][/QUOTE]
Когда-нибудь слышал о интеллектуальных указателях? Загляни в utilcls.h:
Код:
...
~TComInterface()
{
Reset();
}
...
void Reset(T* p = 0)
{
if (intf)
intf->Release();
intf=p;
}
~TComInterface()
{
Reset();
}
...
void Reset(T* p = 0)
{
if (intf)
intf->Release();
intf=p;
}
он делает ЭТО сам.