4

Windows XP で Wise Package Studio 7.0 SP2 を使用しています。

私は MSI Wrapped EXE インストールを持っています。これは、いくつかのファイルをうまくインストールしてから、app.exe として参照できるインストールからファイルの 1 つを実行することを目的としています。

そのため、MSI エディタの [Execute Deferred] タブで、次の行を追加する必要がありました。

If Not Installed then
  Execute Installed Program app.exe (Action)
End

これにより、app.exe がインストール時にのみ実行され、変更/修復/削除中には実行されなくなりました。app.exe が実行されると、それ自体がシステム トレイに便利に追加されます。

取り外し中に逆のことをするものを探しています。app.exe プロセスを停止して、システム トレイから削除したい。

現在、削除するとすべてのファイルが削除されますが、app.exe は実行されたままで、システム トレイに表示されます。私は条件文を追加することを見てきました:

If REMOVE~="ALL" then
  *remove the app from the systray!*
End

条件付きステートメントにより、削除時にのみ何かを実行できますが、実際にプロセスを終了するための最良の方法がわかりません。それを可能にするために実行できるMSIコマンドはありますか? それを行う独自の.exeを作成する必要がありますか?

4

4 に答える 4

2

6 か月前、同じことを行うために VBScript アクションを使用していましたが、SP3 がリリースされたちょうどその頃、objProcess.Terminate() 関数が一部のマシンで動作を拒否しました。私たちが何をしたとしても、それはただ凍りついた。これはテスト マシンの約 10% で発生したため、代替ソリューションを見つける必要がありました (何人の顧客がフリーズしたかは誰にもわかりません!)。

私の最初の発見は組み込み (Windows 2000 以降) コマンド TASKKILL でしTASKKILL /IM app.exe /Fた。

そのpskill.exeため、sysinternals のツールを使用しています。コマンド ライン スイッチを使用して使用許諾契約のプロンプトを抑制する必要がありますが、それ以外は、私が見つけた実行中の EXE を強制終了する最も確実な方法です。

もちろん、最善の解決策は、たまたまC++を少し知っている場合に備えて、独自のEXEまたはDLLを構築することです;)

于 2008-10-31T07:09:49.037 に答える
1

プロセスを終了するだけでは、Windows通知領域がクリーンアップされないため、十分ではありません(ただし、マウスが次にカーソルを合わせたときに、一致するプロセスのないアイコンがWindowsによってクリーンアップされます)。アプリを突然終了するもう1つの理由は、通常、デバッグ用に予約するのが最適です。残念ながら、より適切な解決策もより複雑です。アプリで名前付きイベントを作成し、設定時に呼び出されるコールバックメソッドを登録できます。コールバックはアプリを閉じます。次に、イベントを設定し、プロセスが終了するまで待機するカスタムアクションを記述します。

キャンセルをサポートする必要がある場合(たとえば、ユーザーが変更を保存していないことを確認し、キャンセルしないことを決定した場合)、別の名前付きイベントを使用してそのことを示すことができるため、カスタムアクションはプロセスの終了またはキャンセルイベントのいずれかを待機する場合があります、 いずれか早い方。

于 2009-09-22T20:53:37.817 に答える
0

VBscript 要素をカスタム アクションとして MSI に挿入できます。このようなものが仕事をするはずです:

strMachine = "localhost"
strAppName = "notepad.exe"

Set objProcesses = GetObject("winmgmts://" & strMachine).ExecQuery("SELECT * FROM Win32_Process WHERE Caption LIKE '" & strAppName & "'")

For Each objProcess In objProcesses
    intRetVal = objProcess.Terminate(0)
Next
于 2008-10-31T04:55:53.690 に答える
0

app.exe が社内で作成された場合、現在実行中のものを強制終了するように指示するコマンド ラインを追加できます。そのコマンドラインを指定すると、プログラムの最初のインスタンスにメッセージまたは何かを送信して終了するように指示し、プログラムの最初のインスタンスが実際に終了するまで待ちます。インストーラーは、キル スイッチを使用してプログラムを実行し、キル スイッチのインスタンスが返されたときに元のインスタンスがなくなったことを認識できます。

于 2011-01-07T22:12:43.303 に答える