DeskBand 实现7(遇到的问题2)
来源:互联网 发布:阿里云卖域名 编辑:程序博客网 时间:2024/06/10 03:04
一、最近又发现一个问题,相当严重,但重现机率相当小,最后通过打LOG,调了半天,终于找到原因。
现象如下:
把Desk Band关闭,再重新打开就会把explorer弄挂掉。一定要多试几次才可能出现。
原因是什么呢?
Desk Band出来是会创建一个窗体的,同时也会注册一个全局类,调用RegisterClass函数就行。
RegisterClass会指定一个消息处理函数地址,也就是一个回调函数。
当你把DLL卸载后,这个全局类的信息还是保存在系统中,当DLL再次加载时,又会调用RegisterClass来注册一个类,系统发现这个类已经被注册,就会返回一个错误代码为ERROR_CLASS_ALREADY_EXISTS的错误,指示类已经被注册。如果此时忽略这个错误,创建窗体,如果运气好的话,没什么问题,会创建成功,如果运气不好的话,就会在CreateWindow(Ex)这里挂掉,因为当调用CreateWindow时,它会发送WM_NCCREATE消息到这个窗体对应的消息处理函数中,但系统类里面保存的处理函数的地址还是原来DLL的地址,在这个新加载进来的DLL里面去找这个地址,就有可能出错,因为这个地址所指的地方有可能根本不是这个回调函数。所以,我们在窗体销毁时一定要调用UnregisterClass函数来反注册这个系统类。
二、如何立即让系统卸载不用的DLL
系统是不会马上去卸载那些已经可以卸载的DLL,它有一个轮循周期,据我观察,好像是15分钟左右吧。要想立即卸载不用的DLL,可以调用
CoFreeUnusedLibraries函数。
或者通过如下方式也可以做到:(针对Desk Band)
// Find handle to the task bar.
HWND hTaskbarWnd = FindWindow(L"Shell_TrayWnd", NULL);
// If task bar receives this message, it will call CoFreeUnusedLibraries function
// immediately to free unused libraries.
PostMessage(hTaskbarWnd, WM_TIMER, 24, 0);
- DeskBand 实现7(遇到的问题2)
- DeskBand 实现6(遇到的问题)
- DeskBand实现之——遇到的问题2
- DeskBand实现之——遇到的问题
- DeskBand 实现2(实现声明)
- DeskBand 实现5(注册)
- DeskBand 实现3(代码实现)
- DeskBand 实现1(对象介绍)
- DeskBand 实现4(四个函数)
- DeskBand实现之——实现声明
- DeskBand实现之——代码实现
- DeskBand实现之——对象介绍
- DeskBand实现之——四个函数
- 实现索引遇到的问题
- 对 DeskBand 编制者的一个好消息
- 遇到的问题2
- petapoco中遇到的问题(对象必须实现 IConvertible)
- UISplitViewController的实现中遇到的问题
- Java 中的观察者模式
- 第11章 并发控制(数据库系统概论)
- install xmms
- DeskBand 实现6(遇到的问题)
- java中去字符串中的(全角)空格
- DeskBand 实现7(遇到的问题2)
- C语言字符数组的赋值问题及比较
- super is配置页面打不开的问题
- 最简单的Js时间格式验证,含时分秒!
- ClearCase完全攻略(九)UCM实例:CCRC和CCweb的区别
- myeclipse svn 修改用户名和密码
- net_device结构体
- Myeclipse6.0 properties文件编辑工具
- MS 安全补丁检测和部署的说明