使用mfc CHtmlView内存泄露解决方法
第一步,谷歌有文章说CHtmlView部分api使用BSTR没释放:
解决方法是重写一下接口:
CString GetFullName() const;
CString GetFullName() const;
CString GetType() const;
CString GetLocationName() const;
CString GetLocationURL() const;
void Navigate(LPCTSTR URL, DWORD dwFlags = ,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = );
BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);
CString CHtmlViewEx::GetFullName() const
{
ASSERT(m_pBrowserApp != NULL); BSTR bstr;
m_pBrowserApp->get_FullName(&bstr);
CString retVal(bstr); SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
} CString CHtmlViewEx::GetType() const
{
ASSERT(m_pBrowserApp != NULL); BSTR bstr;
m_pBrowserApp->get_Type(&bstr); CString retVal(bstr); SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
} CString CHtmlViewEx::GetLocationName() const
{
ASSERT(m_pBrowserApp != NULL); BSTR bstr;
m_pBrowserApp->get_LocationName(&bstr);
CString retVal(bstr); SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
} CString CHtmlViewEx::GetLocationURL() const
{
ASSERT(m_pBrowserApp != NULL); BSTR bstr;
m_pBrowserApp->get_LocationURL(&bstr);
CString retVal(bstr); SysFreeString(bstr); // Added this line to prevent leak.
return retVal;
} void CHtmlViewEx::Navigate(LPCTSTR lpszURL, DWORD dwFlags /*= 0*/, LPCTSTR lpszTargetFrameName /*= NULL*/, LPCTSTR lpszHeaders /*= NULL*/, LPVOID lpvPostData /*= NULL*/, DWORD dwPostDataLen /*= 0*/)
{
CString strURL(lpszURL);
BSTR bstrURL = strURL.AllocSysString(); COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == )
dwPostDataLen = lstrlen((LPCTSTR)lpvPostData); vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
} m_pBrowserApp->Navigate(bstrURL, COleVariant((long)dwFlags, VT_I4), COleVariant(lpszTargetFrameName, VT_BSTR),
vPostData, COleVariant(lpszHeaders, VT_BSTR)); SysFreeString(bstrURL); // Added this line to prevent leak.
} BOOL CHtmlViewEx::LoadFromResource(LPCTSTR lpszResource)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL); CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH]; if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
Navigate(strResourceURL, , , );
}
else
bRetVal = FALSE; delete[] lpszModule;
return bRetVal;
} BOOL CHtmlViewEx::LoadFromResource(UINT nRes)
{
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL); CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH]; if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
Navigate(strResourceURL, , , );
}
else
bRetVal = FALSE; delete[] lpszModule;
return bRetVal;
}
第二步,由于加载页面js脚本并没有释放js变量所分配的内存,有两种解决方法:第一种,调用本地html文件,调用CollectGarbage()接口回收变量的内存,html文件代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head> <body>
<script type="text/javascript">
if (typeof window.CollectGarbage === 'function') {
CollectGarbage()
}
</script> </body>
</html>
第二种:如果不需要调用html页面的js代码,可以直接关闭IE浏览器的js脚本功能:https://jingyan.baidu.com/article/48206aead44e53216ad6b397.html
转载请注明出处,from博客园hemjohn
使用mfc CHtmlView内存泄露解决方法的更多相关文章
- Flex内存泄露解决方法和内存释放优化原则
Flex内存泄露解决方法和内存释放优化原则 你对Flex内存泄露的概念是否了解,这里和大家分享一下Flex内存释放优化原则和Flex内存泄露解决方法,希望本文的介绍能让你有所收获. Flex内存释放优 ...
- android webview内存泄露解决方法
完整的activity的onDestroy()方法:@Override protected void onDestroy() { if( mWebView!=null) { // 如果先调用destr ...
- jmeter 内存溢出解决方法
执行“评论新鲜事”200并发就内存溢出 解决方法: [caozijuan@test09 bin]$ vi jmeter JVM_ARGS="-Xms1024m -Xmx4096m" ...
- XCode编译文件过多导致内存吃紧解决方法
XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧
- Android使用帧动画内存溢出解决方法
Android使用帧动画内存溢出解决方法https://blog.csdn.net/daitu_liang/article/details/52336015https://blog.csdn.net/ ...
- C#防止内存泄露的方法
一般程序员()都会这样认为:用C#这样的语言编程的一个好处就是无需再考虑内存的分配和释放.你只需创建对象,然后通过一种叫做垃圾收集的机制来处理这 些对象,也就是说:当它们不再被应用程序需要的时候来自动 ...
- JDBC的批量查询报告内存溢出解决方法
由于表中的数据过多(我的超过了50W+),查询select * from table ....报告内存溢出 Exception in thread "main" java.lang ...
- webstorm狂吃内存的解决方法
今天使用webstorm,电脑居然卡死了,我的电脑配置: 运行内存16g,1.5T内存的台式, 后来发现,可以通过设置 内存值大小来解决. 具体办法: 找到WebStorm.exe.vmoptions ...
- Tomcat内存溢出解决方法
Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...
随机推荐
- 2014 Noip提高组 Day1
P1328 生活大爆炸版石头剪刀布 [题目描述] 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头 ...
- [Xcode 实际操作]六、媒体与动画-(8)使用CATransaction Reveal制作渐显动画
目录:[Swift]Xcode实际操作 本文将演示如何制作渐显动画. 图片的不透明度逐渐发生了变化,从而产生作渐显动画的效果. 在项目导航区,打开视图控制器的代码文件[ViewController.s ...
- C 语言实例 - 判断正数/负数
C 语言实例 - 判断正数/负数 用户输入一个数字,判断该数字是正数还是负数或是零. 实例 #include <stdio.h> int main() { double number; p ...
- 实验一 用户界面与Shell命令
一.实验课时:2学时 二.实验目的 v 熟悉redhat_linux的用户界面,会进行常用的系统设置. v 掌握常用的shell命令. 三.实验环境 v 运行Windows xp\2000\20 ...
- python HTTP 状态码
404 Not Found 在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码. 400 Bad Request 如果你调用了一个没有默 ...
- 作用域提升(Scope Hositing )是 Webpack 3 的标志性特征
http://blog.csdn.net/playboyanta123/article/details/73533079
- sql 模版
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- ...
- MySQL存储过程多条修改语句
DROP procedure Sel_Function_ActivityPastDueDELIMITER $$DROP procedure IF EXISTS`shouyi`.`Sel_Functio ...
- Runner启动器
Runner启动器的两种创建方式: 实现ApplicationRunner接口,复写run()方法 实现CommandLineRunner接口,复写run()方法 Runner启动器的执行顺序 如果一 ...
- jquery显示隐藏效果
通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素toggle() 方法来切换 hide() 和 show() 方法. 1.hide()隐藏元素 $(se ...