关闭另一个进程中互斥锁的句柄

Close handle to a mutex in another process

本文关键字:句柄 另一个 进程      更新时间:2023-10-16

我想关闭位于另一个进程中的互斥锁的句柄,这样我就可以运行应用程序的多个实例。

我已经知道这是可以做到的,参见进程资源管理器。示例:Windows 扫雷 (Windows 7)使用互斥锁只允许一个游戏,所以我想我会用它作为一个例子,因为它是预装在Windows中的,因此更容易指导我。

我需要关闭的互斥锁是Sessions1BaseNamedObjectsOberon_Minesweeper_Singleton,这是我使用进程资源管理器找到的。

在关闭这个互斥后,我能够启动扫雷两个游戏,但我想在我的程序中使用c++来实现。

经过一番搜索,我发现我可能需要API DuplicateHandle。到目前为止,我还不能关闭这个互斥锁的句柄。 下面是我的代码:
#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是错误的

DuplicateHandle的第二个参数期望"在源进程的上下文中有效的开放对象句柄",但是我相信你传递的句柄只在当前进程中有效(OpenMutex创建一个现有互斥对象的新句柄)。您可能需要确定远程进程中的互斥锁句柄是什么,并在调用DuplicateHandle时使用该值。