Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Утечка памяти в CppWebBrowser

386
31 декабря 2005 года
newcss
297 / / 05.04.2005
Народ... Кто знает как бородться с этой бякой? Перерыл кучу сайтоыв и кучу форумов...


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-ть раз выпустили... кучу компонтет =(, уже хоЦЦа на делфи переходить =(, но мне язЫк очччч ненравиЦЦа их...
246
04 января 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by newcss
Народ... Кто знает как бородться с этой бякой? Перерыл кучу сайтоыв и кучу форумов...
...
Вообщем так посоветовали работать... Всеравно утечка памяти... и делал через контроллер интерфейс.... Не помогает... утекает память и все =(, хоть убеЙте =(
Для C++ Buildera нету исправленных или доделанных компонет таких? Просто в делфях уже 10-ть раз выпустили... кучу компонтет =(, уже хоЦЦа на делфи переходить =(, но мне язЫк очччч ненравиЦЦа их...


Давай по порядку - что нужно сделать?

386
04 января 2006 года
newcss
297 / / 05.04.2005
Цитата:
Originally posted by GIZMO
Давай по порядку - что нужно сделать?


Есть форма =). На ней CppWebBrowser...
Этот браузер работает со страничками в которых куча фреймов...
Нужно получить доступ к содержимому страницы... Поуправлять им... Нажать кнопочку, заполнить форму... Возникает такая штука, что когда ползаешь по страничкам с фреймами браузер пожирает память и не освобождает ее...

Мне посоветовали работать через ControlInterface:

if(CppWebBrowser1 ->ControlInterface->Document)
{
CppWebBrowser1 ->ControlInterface->Document->QueryInterface(__uuidof( IHTMLDocument2),(void**)&iDoc);
}

Но даже при такой работе идет накопление памяти... Хотелось бы работать так, чтобы освобождал память.... А то через 1-2 часа работы начинает поедать более 100 метров динамической памяти... =(

246
05 января 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by newcss

...
Нужно получить доступ к содержимому страницы... Поуправлять им... Нажать кнопочку, заполнить форму... Возникает такая штука, что когда ползаешь по страничкам с фреймами браузер пожирает память и не освобождает ее...


Давай для начала правильно получим полностью загруженную страницу:

Код:
_di_IDispatch CurDispatch = NULL; // save the interface globally

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

  }
}

пробуй...
386
05 января 2006 года
newcss
297 / / 05.04.2005
Хм... странно... Создал с нуля проект... Сделал как ты написал.... Открыл Process Explorer.
Ползаю по сайту с фреймами, слежу за памятью...
Сначала было 62 000 K, открыл страницу стало около 160 000 К, немного полазил теперь 220 000 К.

Это оно заносит в КЕШ страницы или как?
246
06 января 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by newcss
Хм... странно... Создал с нуля проект... Сделал как ты написал.... Открыл Process Explorer.
Ползаю по сайту с фреймами, слежу за памятью...
Сначала было 62 000 K, открыл страницу стало около 160 000 К, немного полазил теперь 220 000 К.

Это оно заносит в КЕШ страницы или как?


А IE как себя ведет в этом случае? Покажи чего делаешь на странице.

386
13 марта 2006 года
newcss
297 / / 05.04.2005
Цитата:
Originally posted by GIZMO
А IE как себя ведет в этом случае? Покажи чего делаешь на странице.




CppWebBrowser кеширует все, поэтому и жрет памяти столько...
Код помог, но только трабл теперь с фреймами...
Первый раз когда пробегает по коду все пучком работает нормально... а во второй раз ругаеЦЦа... типа обращение к 000000 адресу памяти... странно...

---------------------------
Как узнать какой фрейм обновился?

386
13 марта 2006 года
newcss
297 / / 05.04.2005
Решил не париЦЦа с обновлением фрейма, а просто сделал так - CppWebBrowser1->Refresh();

void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{

if(pDisp == CurDispatch)
{


CurDispatch = NULL; //clear the global variable}
ShowMessage("lol");
}


Тут перестало работать... =(
Теперь pDisp != CurDispatch (причем всегда)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог