通常,如果我们实现了一个 DeskBand,在卸载或者升级的时候通常会因为删除不掉相应的 DLL 文件而苦恼。很久以来就发现 Windows Media Player 自带的 DeskBand 却不存在此问题,如果你从任务栏的关联菜单中把它的选中状态去掉,几乎马上就可以删除 wmpband.dll 这个文件。
曾经跟踪过几次,但每次都浅尝则止,今天终于横下一条心,决心跟踪到底。果然皇天不负有心人,结果简单的和 1 一样,示例代码如下:
1 2 3 |
// 让 Shell_TrayWnd 释放不使用的 DeskBand 动态链接库 HWND hwndTray = FindWindow(TEXT("Shell_TrayWnd"), NULL); PostMessage(hwndTray, WM_TIMER, 24, 0); |
如果任务栏收到此消息,则会立刻调用 CoFreeUnusedLibraries 函数,将不再使用的动态链接库释放掉。
但是好像加载的其他外壳扩展(例如关联菜单扩展)不行,不知为何。接着试!
更新(2005-02-18 10:23):调试发现,关联菜单扩展的 DLL 的 DllCanUnloadNow() 函数也被调用了,而且返回值的确是 S_OK,但 CoFreeUnusedLibraries() 函数就是不对该 DLL 调用 FreeLibrary(),好像还要进行若干其他判断,实在搞不懂。