簡體   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