繁体   English   中英

如何在不重新启动资源管理器进程的情况下删除桌面带并删除其dll?

[英]how can i remove a deskband and delete its dll without restart the explorer process?

我在任务栏上创建了一个表带。 当我想更新桌面带的DLL时,我将其隐藏起来,取消注册,但是不幸的是,资源管理器仍将该DLL保留在内存中。

如何在不重新启动资源管理器进程的情况下更新dll? 有这种情况的Windows API吗?

“不受支持的”(又名hack)解决方案(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函数没有害处。

不,没有支持的方法来执行此操作。 DLL最早可能会卸载,如果它从DllCanUnloadNow返回true且之间有一定延迟(例如,由CoFreeUnusedLibraries触发),则该DLL必须来自资源管理器进程。 取消注册不会有任何影响。

如果您正在开发这种DLL,则需要重新启动资源管理器。

马丁

正如Martyn所说,没有一种支持的方法可以完全按照您的要求进行。

但是您仍然可以减少更新过程的干扰。 只需让您的插件DLL充当资源管理器的准系统界面,然后将其他所有内容卸载到单独的DLL,您就可以从进程中显式加载和卸载该DLL。 然后,仅当界面需要更改时才需要重新加载资源管理器。 如果操作正确,则几乎不必更新插件DLL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM