首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不重新启动资源管理器进程的情况下移除桌面带并删除其dll?

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

Stack Overflow用户
提问于 2011-11-22 14:09:37
回答 3查看 795关注 0票数 1

我在任务栏上创建了一个桌面栏。当我想要更新deskband的DLL时,我会隐藏它,注销它,但不幸的是资源管理器仍然将这个DLL保存在内存中。

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

EN

回答 3

Stack Overflow用户

发布于 2012-01-04 00:57:51

“不受支持”(也称为hack)解决方案(C/C++):

代码语言:javascript
复制
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++)是:

代码语言:javascript
复制
KillTimer(hWnd, 0x18);
CoFreeUnusedLibraries();

对于不存在的定时器,调用KillTimer函数没有坏处。

票数 3
EN

Stack Overflow用户

发布于 2011-11-22 14:58:50

不,没有支持的方法来做这件事。DLL最早可以卸载的情况是,它从DllCanUnloadNow返回了几次true,但其间有一段延迟--例如,由必须来自浏览器进程的CoFreeUnusedLibraries触发。注销它不会有任何影响。

如果你正在开发这种动态链接库,你需要熟悉重启资源管理器。

马丁

票数 0
EN

Stack Overflow用户

发布于 2011-11-22 15:57:16

正如Martyn所说,没有支持的方法来准确地完成你所要求的事情。

但您仍然可以减少更新过程的侵入性。只需让您的插件DLL仅作为浏览器的基本接口,并将其他所有内容卸载到一个单独的DLL,您可以显式地从进程中加载和卸载。然后,你只需要在界面发生变化时重新加载资源管理器。如果操作得当,您应该很少需要更新插件DLL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8222711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档