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

标签 c++ mutex

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

我已经知道这是可以做到的,see Process Explorer .示例:Windows Minesweeper (Windows 7) 使用互斥锁来只允许一个游戏,所以我想我会用它作为示例,因为它预装在 Windows 中,因此你们更容易指导我.

我需要关闭的互斥体是 \Sessions\1\BaseNamedObjects\Oberon_Minesweeper_Singleton,这是我使用 Process Explorer 找到的。

关闭这个互斥锁后,我能够启动两个扫雷游戏,但我想在我的程序中使用 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 时使用该值。

关于c++ - 关闭另一个进程中互斥锁的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690969/

相关文章:

c++ - 在 C++ 中获取指向复数 vector 的实部和虚部的指针

c++ - 是否有跨平台的方法来禁用 C++ 中已弃用的警告?

c++ - future 和 shared_future 有什么区别?

c# - 防止程序的多个实例的最安全方法是什么?

c++ - 带有 waitKey 的 opencv imshow 在 Mac OS X 10.10.2 上太慢(使用 c++)

c++ - 在 C++ 中什么时候应该使用函数而不是仿函数?

c++ - 原子类型和线程

c++ - 范围互斥锁的自定义 RAII C++ 实现

c++ - 在 C++ 中向多态树添加功能

c++ - 将两个或多个互斥量应用于一段代码