2011-12-31 12 views
1

別のプロセスにある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への私のパラメータのいくつかは間違っていると思います。

+2

この種のミューテックスは、Microsoftが無差別に攻撃された後のXP SP1の脆弱性のリストでは高かった。サービス拒否、DOSは別の意味を持っています。あなたはその対策を楽しんでいます。このことをもう一度やり直すのはどういうことでしたか? –

+0

@ HansPassant目的は、Mutexロックを渡し、同じアプリケーションの複数を実行できるようにすることです。 – WePro2

+0

あなたは*間違いなく* "シングルトンアプリケーション"のポイントを見落としています。 Googleクエリに入力するだけです。 –

答えて

1

DuplicateHandleへの第2引数は「元プロセスのコンテキストで有効なオープンオブジェクトハンドル」を期待し、しかし、私は(あなたに渡しているハンドルは、現在のプロセス内で有効であると考えているOpenMutexが作成されます既存のmutexオブジェクトへの新しいハンドル)。おそらく、リモートプロセス内のミューテックスのハンドルが何であるかを判断し、DuplicateHandleを呼び出すときにその値を使用する必要があります。

+0

あなたの素早い返答のために、あなたはリモートプロセスからハンドルを取得する方法について提案してもらえますか? – WePro2

+0

通常、ローカルプロセスとリモートプロセスは、プロセス間通信(ソケット、パイプ、共有メモリなど)を介してハンドルIDを共有します。あなたはリモートプロセスを制御しないので、この情報をどのように取得するのかはわかりません。 – DRH

+0

私はおそらくリモートプロセスからハンドルを渡すために.dllを注入すると思ったが、注入された.dllからミューテックスを削除する方が簡単ではないだろうか? – WePro2

関連する問題