我在任务栏上创建了一个桌面栏。当我想要更新deskband的DLL时,我会隐藏它,注销它,但不幸的是资源管理器仍然将这个DLL保存在内存中。
如何在不重新启动资源管理器进程的情况下更新dll?有没有针对这种情况的Windows api?
发布于 2012-01-04 00:57:51
“不受支持”(也称为hack)解决方案(C/C++):
HWND hWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hWnd != NULL)
PostMessageW(hWnd, WM_TIMER, 0x18, 0);这将强制在浏览器进程中调用CoFreeUnusedLibraries函数。
在Windows 7旗舰版SP1 64位和Windows XP专业版SP3 32位上进行了测试。
顺便说一句,你可以点击Windows+D (最小化所有窗口)并等待3分钟。程序性黑客就是基于这种行为的。它只是在浏览器进程中调用计时器处理程序。处理程序代码(C/C++)是:
KillTimer(hWnd, 0x18);
CoFreeUnusedLibraries();对于不存在的定时器,调用KillTimer函数没有坏处。
发布于 2011-11-22 14:58:50
不,没有支持的方法来做这件事。DLL最早可以卸载的情况是,它从DllCanUnloadNow返回了几次true,但其间有一段延迟--例如,由必须来自浏览器进程的CoFreeUnusedLibraries触发。注销它不会有任何影响。
如果你正在开发这种动态链接库,你需要熟悉重启资源管理器。
马丁
发布于 2011-11-22 15:57:16
正如Martyn所说,没有支持的方法来准确地完成你所要求的事情。
但您仍然可以减少更新过程的侵入性。只需让您的插件DLL仅作为浏览器的基本接口,并将其他所有内容卸载到一个单独的DLL,您可以显式地从进程中加载和卸载。然后,你只需要在界面发生变化时重新加载资源管理器。如果操作得当,您应该很少需要更新插件DLL。
https://stackoverflow.com/questions/8222711
复制相似问题