7

C++とCOMで記述されたシェル拡張dllがあります。dllが登録されてメモリにロードされます。私のアップグレードセットアッププログラムは次のことを行います。

  • シェル拡張dllの登録を解除し、explorer.exeを強制終了します
  • シェル拡張dllの新しいバージョンをコピーします(ステップ2)
  • explorer.exeを開始します

正常に動作します。しかし、問題は次のとおりです。

ユーザーが他のアプリケーション(Internet Explorer、場合によってはWindowsタスクマネージャー、メモ帳など)を開いた場合、手順2は失敗します。

dllのアップグレード中にすべてのシェル拡張dllフックを閉じる方法はありますか?

dllでは、GetOverlayInfo、コンテキストメニュー、データベース接続などを使用しています

4

2 に答える 2

8

簡単に言えば、それをしないでください(つまり、強制的にアンロードしないでください)。シェル拡張がロードされているすべてのプロセスを列挙してから、それらを「再起動」する必要があります。これは非常に侵襲的で率直に言って、悪い振る舞いです(インストーラーにとって)。これには、インストーラー他の方法では必要としない可能性のある特定の特権も必要です。

ほとんどの人がまだ気付いていないようですが、MoveFile(および)を使用して、実行中のアプリケーションで現在使用されているMoveFileExDLLまたはEXEファイルを移動できます。

これは、Windowsインストーラが採用するアプローチです。\Config.msiいくつかをインストールした後、特定のドライブのルートにあるフォルダに気づいたことがありますか.msi?このフォルダには、実際には、移動されたがその時点でまだ使用されていた元のファイルが含まれています(移動され、通常は一意の「一時的な」名前に名前が変更されます)。その後、通常、起動時に(MoveFileExを使用してMOVEFILE_DELAY_UNTIL_REBOOT)削除するようにスケジュールされます。

自作インストーラーで同じメカニズムを使用して、使用中の古いファイルを元の場所から移動し、もう一方のファイルをすぐに移動することができます。新しいアプリケーションインスタンスは新しいシェル拡張機能(*)を使用しますが、古いアプリケーションインスタンスは、ある時点または別の時点でそれをロードした実行中のアプリケーションによって引き続き使用されます。

(*)DLLのロードに適用されるルールがあり、状況によっては同じ名前のモジュールが再度ロードされないようにするため、これについて100%確信が持てません。

于 2012-07-06T16:39:02.883 に答える
1

インストーラーによっては、 WindowsVista+のRestartManagerサポートを利用できる場合があります。これにより、セットアップでDLLを使用しているすべてのアプリケーションを照会し、それらを正常にシャットダウンすることができます。できない場合は、再起動時に交換用に登録する必要があります。セットアップが完了すると、Restart Managerは、シャットダウンしたプログラム(再起動をサポートするプログラム)を再起動しようとします。

于 2013-03-13T09:25:06.880 に答える