我想关闭位于另一个进程中的互斥锁的句柄,这样我就可以运行多个应用程序实例。
我已经知道可以做到这一点see Process Explorer。示例:Windows Minesweeper (Windows 7)使用互斥锁只允许一个游戏,所以我想我会用它作为一个例子,因为它预先安装了Windows,因此你们更容易引导我
我需要关闭的互斥锁是\Sessions\1\BaseNamedObjects\Oberon_Minesweeper_Singleton
,我使用Process Explorer找到了它。
关闭此互斥锁之后,我能够启动两个 Minesweeper 游戏,但我想在我的程序中使用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的一些参数是错误的。
答案 0 :(得分:1)
DuplicateHandle
的第二个参数需要“一个在源进程上下文中有效的开放对象句柄”,但是我相信你传入的句柄只会是在当前进程中有效(OpenMutex
创建现有互斥对象的新句柄)。您可能需要确定远程进程中互斥锁的句柄是什么,并在调用DuplicateHandle
时使用该值。