別のプロセスにあるmutexのハンドルを閉じて、アプリケーションの複数のインスタンスを実行できます。別のプロセスのmutexへのハンドルを閉じる
私はすでにこれができることを知っています、see Process Explorer。例:Windows Minesweeper(Windows 7)はミューテックスを使用して1つのゲームだけを許可しているので、Windowsとあらかじめインストールされているため、私をガイドする方が簡単です。
私が閉じる必要があるミューテックスは、プロセスエクスプローラを使用して見つけた\Sessions\1\BaseNamedObjects\Oberon_Minesweeper_Singleton
です。
このミューテックスを閉じた後、マインスイーパの2つのゲームを起動することができましたが、私はC++を使用して自分のプログラムでこれをやりたいのです。
検索の結果、APIが必要な場合があります。DuplicateHandleこれまで私はこのmutexのハンドルを閉じることができませんでした。ここで
は、これまでの私のコードです:
#include <Windows.h>
#include <iostream>
using namespace std;
void printerror(LPSTR location){
printf("Error: %s_%d", location, GetLastError());
cin.get();
}
int main(){
DWORD pid = 0;
HWND hMineWnd = FindWindow("Minesweeper", "Minesveiper");
GetWindowThreadProcessId(hMineWnd, &pid);
HANDLE hProc =OpenProcess(PROCESS_DUP_HANDLE, 0, pid);
if(hProc == NULL){
printerror("1");
return 1;
}
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, TRUE, "Oberon_Minesweeper_Singleton");
if(hMutex == NULL){
printerror("2");
return 2;
}
if(DuplicateHandle(hProc, hMutex, NULL, 0, 0, FALSE, DUPLICATE_CLOSE_SOURCE) == 0){
printerror("3");
return 3;
}
if(CloseHandle(hMutex) == 0){
printerror("4");
return 4;
}
return 0;
}
このコードは、0を返しますが、ミューテックスはまだそこにある、と私はマインスイーパのより多くのゲームを起動することはできませんよ。 DuplicateHandleへの私のパラメータのいくつかは間違っていると思います。
この種のミューテックスは、Microsoftが無差別に攻撃された後のXP SP1の脆弱性のリストでは高かった。サービス拒否、DOSは別の意味を持っています。あなたはその対策を楽しんでいます。このことをもう一度やり直すのはどういうことでしたか? –
@ HansPassant目的は、Mutexロックを渡し、同じアプリケーションの複数を実行できるようにすることです。 – WePro2
あなたは*間違いなく* "シングルトンアプリケーション"のポイントを見落としています。 Googleクエリに入力するだけです。 –