簡単に言えば、それをしないでください(つまり、強制的にアンロードしないでください)。シェル拡張がロードされているすべてのプロセスを列挙してから、それらを「再起動」する必要があります。これは非常に侵襲的で率直に言って、悪い振る舞いです(インストーラーにとって)。これには、インストーラーが他の方法では必要としない可能性のある特定の特権も必要です。
ほとんどの人がまだ気付いていないようですが、MoveFile
(および)を使用して、実行中のアプリケーションで現在使用されているMoveFileEx
DLLまたはEXEファイルを移動できます。
これは、Windowsインストーラが採用するアプローチです。\Config.msi
いくつかをインストールした後、特定のドライブのルートにあるフォルダに気づいたことがありますか.msi
?このフォルダには、実際には、移動されたがその時点でまだ使用されていた元のファイルが含まれています(移動され、通常は一意の「一時的な」名前に名前が変更されます)。その後、通常、起動時に(MoveFileEx
を使用してMOVEFILE_DELAY_UNTIL_REBOOT
)削除するようにスケジュールされます。
自作インストーラーで同じメカニズムを使用して、使用中の古いファイルを元の場所から移動し、もう一方のファイルをすぐに移動することができます。新しいアプリケーションインスタンスは新しいシェル拡張機能(*)を使用しますが、古いアプリケーションインスタンスは、ある時点または別の時点でそれをロードした実行中のアプリケーションによって引き続き使用されます。
(*)DLLのロードに適用されるルールがあり、状況によっては同じ名前のモジュールが再度ロードされないようにするため、これについて100%確信が持てません。