c++ - ATL 窗口中的 WebBrowser 控件。如何在窗口卸载时释放内存?我卡住了

标签 c++ activex browser webbrowser-control atl

我有一个 Win32 C++ 应用程序。最后的 while 循环中有 _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)

如果我不创建主窗口,我的应用程序需要大约 150K 的内存。

但是随着在内部创建带有 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();

完全没有成功。

我还创建了一个用于创建主窗口的包装器类。我创建了一个指针并通过删除将其释放:

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

没有成功。还是8500K。 所以请问,我怎样才能摆脱主窗口和它的 WebBrowser 控件并释放内存,返回到大约 150K。 稍后我将重新创建窗口。它是主窗口的动态加载和卸载,具体取决于其他命令。

谢谢!

问候

马丁

最佳答案

您有所谓的引用泄漏。在您对 IWebBrowser2* 调用::Release() 之前,查看打开了多少引用。如果它不是 1,那么某处的其他东西引用了您的对象。

另外,不要忘记 IWebBrowser2::Quit() 你的控件...

关于c++ - ATL 窗口中的 WebBrowser 控件。如何在窗口卸载时释放内存?我卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2640698/

相关文章:

python - 如何在 Python 3 中正确处理字符串嵌入

c++ - 使用指针对链表 C++ 进行排序

c++ - 为什么找到 f1 但找不到 f2?

delphi - 导入COM组件: Difference c# vs. Delphi XE

internet-explorer - IE PrintTemplate 混合上下文警告

c++ - 在不使用指针的情况下在 C++ 中将数组作为引用传递

registry - Active X 选项的哪些注册表项?

python - 您可以将 python 脚本嵌入到网络浏览器中吗?

javascript - 通过 CSS 显示浏览器兼容性警报(网格支持)

javascript - 如何从 Spring MVC Controller 将数据传递到浏览器 JavaScript