Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关闭另一进程中互斥对象的句柄_C++_Mutex - Fatal编程技术网

C++ 关闭另一进程中互斥对象的句柄

C++ 关闭另一进程中互斥对象的句柄,c++,mutex,C++,Mutex,我想关闭位于另一个进程中的互斥锁的句柄,以便可以运行应用程序的多个实例 我已经知道这是可以做到的。示例:Windows扫雷器(Windows 7)使用互斥锁只允许玩一个游戏,所以我想我会以它为例,因为它预装了Windows,所以你们更容易指导我 我需要关闭的互斥锁是\Sessions\1\BaseNamedObjects\Oberon\u mineswipper\u Singleton,这是我使用Process Explorer找到的 关闭这个互斥器后,我就可以启动两个扫雷游戏,但是我想在我的程

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

我已经知道这是可以做到的。示例:Windows扫雷器(Windows 7)使用互斥锁只允许玩一个游戏,所以我想我会以它为例,因为它预装了Windows,所以你们更容易指导我

我需要关闭的互斥锁是
\Sessions\1\BaseNamedObjects\Oberon\u mineswipper\u Singleton
,这是我使用Process Explorer找到的

关闭这个互斥器后,我就可以启动两个扫雷游戏,但是我想在我的程序中使用C++。 经过一些搜索,我发现我可能需要API。到目前为止,我还无法关闭此互斥锁上的句柄

以下是我目前的代码:

#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;
}
#包括
#包括
使用名称空间std;
无效打印错误(LPSTR位置){
printf(“错误:%s_u%d”,位置,GetLastError());
cin.get();
}
int main(){
DWORD pid=0;
HWND hMineWnd=FindWindow(“扫雷艇”、“扫雷艇”);
GetWindowThreadProcessId(hMineWnd和pid);
HANDLE hProc=OpenProcess(PROCESS\u DUP\u HANDLE,0,pid);
if(hProc==NULL){
打印错误(“1”);
返回1;
}
HANDLE-hMutex=OpenMutex(互斥对象(MUTEX)为所有访问,为“Oberon_扫雷者(Oberon_)为单例”);
if(hMutex==NULL){
打印错误(“2”);
返回2;
}
if(DuplicateHandle(hProc、hMutex、NULL、0、0、FALSE、DUPLICATE\u CLOSE\u SOURCE)==0){
打印错误(“3”);
返回3;
}
if(闭合手柄(hMutex)==0){
打印错误(“4”);
返回4;
}
返回0;
}

这段代码返回0,但互斥锁仍然存在,我无法启动更多的扫雷游戏。我认为DuplicateHandle的一些参数是错误的。

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

Thx时使用该值以快速回复。您对如何从远程进程获取句柄有何建议?通常,本地和远程进程将通过进程间通信共享句柄ID(插座、管道、共享内存等)。由于您不控制远程进程,我不确定您将如何检索此信息。我认为可能会注入.dll以从远程进程传递句柄,但从注入的.dll中删除互斥对象不是更容易吗?您可能需要更新问题以描述您的最终解决方案是什么(或添加其他答案)供将来参考。这是您的答案,第二个参数不正确,通过硬编码(使用句柄id),我能够关闭互斥。Thx对于您的快速回复,您对如何从远程进程获取句柄有何建议?通常,本地和远程进程将通过进程间通信共享句柄id(插座、管道、共享内存等)。由于您不控制远程进程,我不确定您将如何检索此信息。我认为可能会注入.dll以从远程进程传递句柄,但从注入的.dll中删除互斥对象不是更容易吗?您可能需要更新问题以描述您的最终解决方案是什么(或添加其他答案)供将来参考。这是您的答案,第二个参数不正确,通过硬编码(使用句柄id)我能够关闭互斥锁。这种互斥锁在微软遭受无情攻击后进入的XP SP1漏洞列表中排名靠前。拒绝服务、DOS具有不同的含义。你正在享受应对措施。再次这样做的目的是什么?@HansPassant目标是通过互斥锁,并保持安全能够运行多个相同的应用程序。你肯定错过了“单例应用程序”的要点。只需在谷歌查询中键入它。为什么是“Minesveiper”"对于
FindWindow
的第二个参数,它是否在挪威版本的Windows上?这种互斥在XP SP1漏洞列表中的位置很高,Microsoft在受到无情的攻击后进入了该漏洞。拒绝服务、DOS具有不同的含义。您正在享受应对措施。这样做的目的到底是什么再次?@HansPassant的目标是通过互斥锁,并能够运行多个相同的应用程序。你肯定没有抓住“单例应用程序”的要点。只需在谷歌查询中键入它。为什么在
FindWindow
的第二个参数中输入“minesvieper”?它是在挪威版本的Windows上吗?