C++ 仅运行双实例

C++ 仅运行双实例,c++,winapi,C++,Winapi,我在寻求帮助。我需要能够只运行我的应用程序的2个实例,但是使用下面的代码,仍然可以启动2个以上的实例。我不确定我错过了什么 代码如下: const char szUniqueNamedSemaphore[] = "Amazon.exe"; HANDLE hHandle = CreateSemaphore(NULL, 2, 2, szUniqueNamedSemaphore); if (!hHandle) { MessageBox(NULL, "Unexpected error creat

我在寻求帮助。我需要能够只运行我的应用程序的2个实例,但是使用下面的代码,仍然可以启动2个以上的实例。我不确定我错过了什么

代码如下:

const char szUniqueNamedSemaphore[] = "Amazon.exe";
HANDLE hHandle = CreateSemaphore(NULL, 2, 2, szUniqueNamedSemaphore);
if (!hHandle)
{
    MessageBox(NULL, "Unexpected error creating Execution!", "Amazon.exe", MB_OK);
    return FALSE;
}
if (WaitForSingleObject(hHandle, 0) != WAIT_OBJECT_0)
{
    MessageBox(NULL, "Game is already running 2 times, additional Execution is prohibited!", "Amazon.exe", MB_OK);
    return FALSE;
}
ReleaseSemaphore(hHandle, 1, NULL);

windows信号量的工作方式您的第三个实例将阻塞,当可用计数不是零而不是相反时,信号量上的WaitForSingleObject将完成。没有进程间原语可以完成您所追求的任务

我建议您组合一个互斥锁和一个共享内存部分(这是一个对您的程序的所有实例都通用的内存部分),并在该部分中保持一个正在运行的实例计数。MSVC允许以下语法:

#pragma section("myShared", read,write,shared)
__declspec(allocate("myShared")) ULONG g_uInstances = 0;

您可能会使用InterlockedIncrement/InterlockedDecrement而不是互斥锁,但即使在超出限制的情况下,也需要记住减少计数。

问题在于,您正在释放信号量,因此在成功等待信号量后立即增加其计数器,从而减少其计数器。因此,它的计数器在每个新实例的开头总是2。在工作完成后准备退出程序之前,不要释放信号量,例如:

const char*szUniqueNamedSemaphore=“Amazon.exe”;
int main()//或WinMain()。。。
{
HANDLE hHandle=CreateSemaphore(NULL,2,2,szUniqueNamedSemaphore);
如果(!hHandle)
{
MessageBox(NULL,“创建执行时出现意外错误!”,“Amazon.exe”,MB_OK);
返回0;
}
DWORD ret=WaitForSingleObject(hHandle,0);
if(ret!=等待对象0)
{
如果(ret==等待超时)
MessageBox(NULL,“游戏已经运行了2次,禁止额外执行!”,“Amazon.exe”,MB_OK);
其他的
MessageBox(NULL,“等待执行时出现意外错误!”,“Amazon.exe”,MB_OK);
返回0;
}
//做你正常的工作。。。
释放信号量(hHandle,1,NULL);
返回0;
}

WaitForSingleObject
如果您给它一个超时,它将不会阻塞,就像OP所做的那样。它将在超时后返回(或者在本例中,立即返回)。“没有进程间原语可以执行您所要执行的操作”-是的,有。一个命名的信号灯非常适合这个任务。嗨,克里斯蒂安,如果这个答案能帮助你解决这个问题,你就可以解决它。如果没有,请随意展示您仍然存在的问题。