2

NSISインストーラーで作業していて、アンインストールする前に特定のアプリケーションが実行されているかどうかを確認しようとしています。だから、私はkernel32::CreateMutexA呼び出しを使用します。チャンクは次のとおりです。

System::Call 'kernel32::CreateMutexA(i 0, i 0, t "cmd.exe") i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
    MessageBox MB_USERICON "The application is already running."
Abort

に入れましたun.onInit。問題は、プロセス(cmd.exeここ)が検出されないことです。

私は何か見落としてますか?

Tx。

4

4 に答える 4

2

簡単な解決策を見つけました。FindProcDLL プラグインを使用します。

そう:

FindProcDLL::FindProc "cmd.exe"
Pop $R0
StrCmp $R0 0 +3
 MessageBox MB_USERICON "The application is already running." IDOK
Abort

PS FindProcDLL.dllを にコピーする必要があります/Plugins

于 2010-01-28T15:32:14.587 に答える
1

あなたがしているのは、グローバル名でミューテックスを作成することだけです"cmd.exe"。のMSDN記事からCreateMutex

lpNameが既存のイベント、セマフォ、待機可能タイマー、ジョブ、またはファイルマッピングオブジェクトの名前と一致する場合、関数は失敗し、GetLastError関数はERROR_INVALID_HANDLEを返します。これは、これらのオブジェクトが同じ名前空間を共有しているために発生します。

したがってcmd.exe、名前が付いたこれらのタイプのオブジェクトの1つへのハンドルを作成しない限り"cmd.exe"、この呼び出しはその名前で新しいミューテックスを作成し、(誤っていない)ハンドルを返します。

于 2010-01-06T16:51:37.660 に答える
1

間違った Win32 API 関数を使用している可能性があります。CreateMutex は、名前付きミューテックス「something.exe」を作成しようとします。その名前のミューテックスがない場合は成功するため、チェックしようとしているプロセスがその名前のミューテックスを作成していない限り、目的の結果は得られません。

あなたが望むのは、おそらく実行中のすべてのプロセスを列挙し、探しているプロセスがそこにあるかどうかを確認することです。これは、Win32 API の ToolHelp32 で行うことができます。サンプルはこちらを参照してください。それを「純粋な」NSISに変換するのがどれほど簡単かはわかりません。そのため、DLLプラグインを作成するか、NSISコミュニティに浮かんでいる既存のソリューションがあるかどうかを確認してください。

于 2010-01-06T17:01:20.633 に答える
0

この種のことについては、NSIS の KillProcess または Find-Close-Terminate プラグインを使用しました。

ドキュメンテーションは非常に簡単です。うまくいけば、これで必要なことが行われ、オーバーヘッドはかなり最小限に抑えられます。

于 2010-01-06T17:21:46.957 に答える