我在任务栏上创建了一个桌面乐队。当我想更新deskband的DLL时,我隐藏它,取消注册它,但不幸的是,探险家仍然将这个DLL保存在内存中。
如何在不重启资源管理器进程的情况下更新dll?这种情况有Windows api吗?
答案 0 :(得分:3)
“不支持”(又名黑客)解决方案(C / C ++):
HWND hWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hWnd != NULL)
PostMessageW(hWnd, WM_TIMER, 0x18, 0);
这将强制在资源管理器进程中调用CoFreeUnusedLibraries函数。
在Windows 7 Ultimate SP1 64位和Windows XP Professional SP3 32位上进行了测试。
顺便说一句,你可以点击Windows + D(最小化所有窗口)并等待3分钟。程序化黑客是基于这种行为。它只是在资源管理器进程中调用计时器处理程序。处理程序代码(C / C ++)是:KillTimer(hWnd, 0x18);
CoFreeUnusedLibraries();
对于不存在的计时器,调用KillTimer函数没有任何害处。
答案 1 :(得分:0)
不,没有支持的方法来做到这一点。最早的DLL可能会卸载,如果它从DllCanUnloadNow返回true几次并且介于两者之间有延迟 - 例如由CoFreeUnusedLibraries触发,这必须来自资源管理器进程。取消注册它将没有任何影响。
如果您正在开发此类DLL,则需要熟悉重新启动资源管理器。
马丁
答案 2 :(得分:0)
正如Martyn所说,没有任何支持的方法可以完全按照你的要求去做。
但是你仍然可以减少更新过程。只需将您的插件DLL作为资源管理器的准系统接口,并将其他所有内容卸载到单独的DLL中,您可以从该进程显式加载和卸载。然后,只需要在界面发生变化时重新加载资源管理器。如果做得好,你很少需要更新插件DLL。