Управление WebBrowser в окне ATL. Как освободить память при выгрузке окна? Я застрял - PullRequest
2 голосов
/ 15 апреля 2010

У меня есть приложение Win32 C ++. В конце цикла есть метод _tWinMain (...) с GetMessage (...). Перед GetMessage (...) я создаю главное окно с

HWND m_MainHwnd = CreateWindowExW(WS_EX_TOOLWINDOW | WS_EX_LAYERED, CAxWindow::GetWndClassName(), _TEXT("http://www.-website-.com"), WS_POPUP, 0, 0, 1024, 768, NULL, NULL, m_Instance, NULL);

ShowWindow(m_MainHwnd)

Если я не создаю главное окно, моему приложению требуется около 150 КБ памяти.

Но с созданием главного окна с элементом управления WebBrowser использование памяти увеличивается до 8500K.

Но я хочу динамически выгрузить главное окно. Мой _tWinMain (...) продолжает работать! Я разгружаюсь с

DestroyWindow(m_MainHwnd)

Но элемент управления WebBrowser не будет выгружаться и освобождать используемую память!

Используемая память приложения все еще 8500K!

Я также могу получить экземпляр WebBrowser или с некоторым дополнительным кодом WebBrowser HWND

IWebBrowser2* m_pWebBrowser2;

CAxWindow wnd = (CAxWindow)m_MainHwnd;

HRESULT hRet = wnd.QueryControl(IID_IWebBrowser2, (void**)&m_pWebBrowser2); 

Итак, я попытался освободить память, используемую главным окном и элементом управления WebBrowser с помощью (скажем, экспериментального):

if(m_pWebBrowser2) 
   m_pWebBrowser2->Release();

DestroyWindow(m_hwndWebBrowser);  //<-- just analogous

OleUninitialize();

Безуспешно.

Я также создал класс-обертку, который создает главное окно. Я создал указатель и освободил его с помощью delete:

Wrapper* wrapper = new Wrapper();
//wrapper creates main window inside and shows it
//...do some stuff
delete(wrapper);

Нет успеха. Еще 8500К. Поэтому, пожалуйста, как я могу избавиться от главного окна и его элемента управления WebBrowser и освободить память, возвращаясь примерно к 150K. Позже я воссоздаю окно. Это динамическая загрузка и выгрузка главного окна, в зависимости от других команд.

Спасибо!

Привет

Martin

Ответы [ 2 ]

1 голос
/ 15 апреля 2010

У вас есть так называемая эталонная утечка. Прежде чем вызывать :: Release () в вашем IWebBrowser2 *, посмотрите, сколько ссылок открыто. Если это не 1, то что-то еще имеет ссылку на ваш объект.

Кроме того, не забудьте IWebBrowser2 :: Quit () ваш элемент управления ...

0 голосов
/ 15 апреля 2010

Память не всегда освобождается именно тогда, когда вы этого хотите. Может быть некоторые вещи, которые класс делает в фоновом режиме, и он должен ждать, пока память не будет полностью удалена. Также возможно, что память была освобождена, но ядро ​​хранит ее как назначенную вашему процессу, предполагая, что ваш процесс, возможно, захочет использовать ее в любом случае.

Если вы создаете другое окно веб-браузера после того, как уничтожили предыдущее, увеличивается ли память на 8350 КБ или она остается более или менее такой же?

...