Утечка памяти в CppWebBrowser
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
if(pDisp!=NULL){
IDispatch* iDisp;
IHTMLDocument2 *iDoc;
IHTMLFramesCollection2 *pFrames = NULL;
long ilFramesCount=0;
long ilFramesCount2=0;
wchar_t *name_frame;
IWebBrowser2 *spIWebBrowser2;
if( SUCCEEDED(pDisp->QueryInterface(IID_IWebBrowser2,(LPVOID*)&spIWebBrowser2)))
{
HRESULT hr=spIWebBrowser2->get_Document((IDispatch**)&iDoc);
if(hr)
{
HRESULT hr=iDoc->get_frames(&pFrames) ;
if(hr)
{
pFrames->get_length(&ilFramesCount);
if(ilFramesCount < 2) ilFramesCount= 0;
for(long ilFrameIndex = 0; ilFrameIndex < ilFramesCount; ilFrameIndex++)
{
vFrame.lVal = ilFrameIndex;
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
{
IHTMLWindow2 *pWindow = NULL;
if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2,(LPVOID*)&pWindow)))
{
pWindow->get_name(&name_frame);
..............
pWindow->Release();
}
}
}
pFrames->Release();
}
iDoc->Release();
}
}
spIWebBrowser2->Release();
pDisp->Release();
}
}
Вообщем так посоветовали работать... Всеравно утечка памяти... и делал через контроллер интерфейс.... Не помогает... утекает память и все =(, хоть убеЙте =(
Для C++ Buildera нету исправленных или доделанных компонет таких? Просто в делфях уже 10-ть раз выпустили... кучу компонтет =(, уже хоЦЦа на делфи переходить =(, но мне язЫк очччч ненравиЦЦа их...
Народ... Кто знает как бородться с этой бякой? Перерыл кучу сайтоыв и кучу форумов...
...
Вообщем так посоветовали работать... Всеравно утечка памяти... и делал через контроллер интерфейс.... Не помогает... утекает память и все =(, хоть убеЙте =(
Для C++ Buildera нету исправленных или доделанных компонет таких? Просто в делфях уже 10-ть раз выпустили... кучу компонтет =(, уже хоЦЦа на делфи переходить =(, но мне язЫк очччч ненравиЦЦа их...
Давай по порядку - что нужно сделать?
Давай по порядку - что нужно сделать?
Есть форма =). На ней CppWebBrowser...
Этот браузер работает со страничками в которых куча фреймов...
Нужно получить доступ к содержимому страницы... Поуправлять им... Нажать кнопочку, заполнить форму... Возникает такая штука, что когда ползаешь по страничкам с фреймами браузер пожирает память и не освобождает ее...
Мне посоветовали работать через ControlInterface:
if(CppWebBrowser1 ->ControlInterface->Document)
{
CppWebBrowser1 ->ControlInterface->Document->QueryInterface(__uuidof( IHTMLDocument2),(void**)&iDoc);
}
Но даже при такой работе идет накопление памяти... Хотелось бы работать так, чтобы освобождал память.... А то через 1-2 часа работы начинает поедать более 100 метров динамической памяти... =(
...
Нужно получить доступ к содержимому страницы... Поуправлять им... Нажать кнопочку, заполнить форму... Возникает такая штука, что когда ползаешь по страничкам с фреймами браузер пожирает память и не освобождает ее...
Давай для начала правильно получим полностью загруженную страницу:
void __fastcall TForm1::CppWebBrowser1NavigateComplete2(TObject *Sender, const _di_IDispatch pDisp, OleVariant &URL)
{
if (!CurDispatch)
CurDispatch = pDisp; // save for comparison
}
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, const _di_IDispatch pDisp, OleVariant &URL)
{
if (pDisp == CurDispatch)
{
/*вот здесь можно - получить доступ к содержимому страницы... Поуправлять им... Нажать кнопочку, заполнить форму... */
CurDispatch = NULL; //clear the global variable
}
}
пробуй...
Ползаю по сайту с фреймами, слежу за памятью...
Сначала было 62 000 K, открыл страницу стало около 160 000 К, немного полазил теперь 220 000 К.
Это оно заносит в КЕШ страницы или как?
Хм... странно... Создал с нуля проект... Сделал как ты написал.... Открыл Process Explorer.
Ползаю по сайту с фреймами, слежу за памятью...
Сначала было 62 000 K, открыл страницу стало около 160 000 К, немного полазил теперь 220 000 К.
Это оно заносит в КЕШ страницы или как?
А IE как себя ведет в этом случае? Покажи чего делаешь на странице.
А IE как себя ведет в этом случае? Покажи чего делаешь на странице.
CppWebBrowser кеширует все, поэтому и жрет памяти столько...
Код помог, но только трабл теперь с фреймами...
Первый раз когда пробегает по коду все пучком работает нормально... а во второй раз ругаеЦЦа... типа обращение к 000000 адресу памяти... странно...
---------------------------
Как узнать какой фрейм обновился?
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
if(pDisp == CurDispatch)
{
CurDispatch = NULL; //clear the global variable}
ShowMessage("lol");
}
Тут перестало работать... =(
Теперь pDisp != CurDispatch (причем всегда)