关于windows中一些系统dll的卸载套路
2017-04-05 19:43
267 查看
今天又遇到坑。
情况是这样。在使用一些系统自带的com对象时,在程序退出时调用ptr->release出错。提示访问被保护的内存。
经过研究发现,在主线程调用CoCreateInstance后加载进来的dll,统一在程序退出时才卸载。
但注意的是如果在非主线程调用CoCreateInstance加载进来的dll,在这个线程退出时,这些dll也跟随卸载(但程序还没退出)。如下:
线程 0x2e8c 已退出,返回值为 0 (0x0)。
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\quartz.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\devenum.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\mfperfhelper.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\MFWMAAEC.DLL”
导致在退出程序时主线程去ptr->release出错。因为这些dll已经被卸载了,ptr指向的对象内存是不错在的。
解决方法如下:
1.统一在一个线程使用这些com对象(例如在主线程)。
2.在调用CoCreateInstance的线程退出前,其他线程主动release(其实不release也行,反正整个dll都卸载了,对象也不存在。但保证别在此线程退出后release就好),做好同步。
情况是这样。在使用一些系统自带的com对象时,在程序退出时调用ptr->release出错。提示访问被保护的内存。
经过研究发现,在主线程调用CoCreateInstance后加载进来的dll,统一在程序退出时才卸载。
但注意的是如果在非主线程调用CoCreateInstance加载进来的dll,在这个线程退出时,这些dll也跟随卸载(但程序还没退出)。如下:
线程 0x2e8c 已退出,返回值为 0 (0x0)。
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\quartz.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\devenum.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\mfperfhelper.dll”
“xxxx.exe”(Win32): 已卸载“C:\Windows\SysWOW64\MFWMAAEC.DLL”
导致在退出程序时主线程去ptr->release出错。因为这些dll已经被卸载了,ptr指向的对象内存是不错在的。
解决方法如下:
1.统一在一个线程使用这些com对象(例如在主线程)。
2.在调用CoCreateInstance的线程退出前,其他线程主动release(其实不release也行,反正整个dll都卸载了,对象也不存在。但保证别在此线程退出后release就好),做好同步。
相关文章推荐
- Windows中一些关于CPU\系统效能的知识——编程之美1.1
- 关于windows系统字体的一些问题
- 关于windows系统安装jdk时出现的一些问题的解决方法
- Windows系统下关于进程的一些命令
- 关于双系统重装windows或者卸载ubuntu修复引导
- 关于windows系统的一些知识
- 关于Windows系统中一些实用的修改常识
- 关于windows下安装wampserver服务器系统丢失msvcr100.dll及VCRUNTIME140.dll的解决办法
- 关于“WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\****\****\****.dll”拒绝访问的解决方法
- 关于Windows内核空间操作的一些说明
- 关于Windows内核空间操作的一些说明
- 一些关于系统架构实现的胡言乱语
- java程序获得windows系统的一些参数(cmd指令运行返回结果)
- 关于VMware不完全卸载的一些问题的总结
- 关于WINDOWS SDK WM_PAINT的一些想法
- 转: 双系统下卸载linux保留windows
- shell32.dll占用了windows系统DLL保存的地址空间而产生了错误
- 关于安装.NET Framework 2.0时偶然碰到的问题(提示"Error 205015. 安装程序集..../System.EnterpriseServices.dll失败,原因是出现了系统错误:拒绝访问。")
- 关于编写高可靠性的软件(系统)的一些思考
- 关于在C#中加入非托管的DLL的一些文章连接