1

タスクバーにデスクバンドを作成しました。デスクバンドの DLL を更新したいときは、非表示にして登録を解除しますが、残念ながら、エクスプローラーはこの DLL をメモリ内に保持しています。

エクスプローラ プロセスを再起動せずに dll を更新するにはどうすればよいですか? そのような場合の Windows API はありますか?

4

3 に答える 3

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 関数を呼び出しても害はありません。

于 2012-01-03T16:57:51.053 に答える
0

いいえ、サポートされている方法はありません。DLL が最も早くアンロードされるのは、DllCanUnloadNow から true が数回返され、その間に遅延が発生した場合です。たとえば、エクスプローラー プロセス内から取得する必要がある CoFreeUnusedLibraries によってトリガーされます。登録を解除しても影響はありません。

この種の DLL を開発している場合は、エクスプローラーの再起動に慣れる必要があります。

マーティン

于 2011-11-22T06:58:49.843 に答える
0

Martyn が言うように、あなたが求めていることを正確に行う方法はサポートされていません。

ただし、更新プロセスの邪魔にならないようにすることはできます。プラグイン DLL をエクスプローラーへのベアボーン インターフェイスとしてのみ機能させ、プロセスから明示的にロードおよびアンロードできる別の DLL に他のすべてをオフロードします。次に、インターフェイスで何かを変更する必要がある場合にのみ、エクスプローラーをリロードする必要があります。正しく行われていれば、プラグイン DLL を更新する必要はほとんどありません。

于 2011-11-22T07:57:16.047 に答える