Проблема в том, что вы освобождаете семафор, увеличивая его счетчик, сразу после того, как вы успешно дождетесь его, что уменьшает его счетчик. Таким образом, его счетчик всегда равен 2 в начале каждого нового экземпляра. Не выпускайте семафор до тех пор, пока вы не будете готовы выйти из программы после ее работы, например:
const char* szUniqueNamedSemaphore = "Amazon.exe";
int main() // or WinMain()...
{
HANDLE hHandle = CreateSemaphore(NULL, 2, 2, szUniqueNamedSemaphore);
if (!hHandle)
{
MessageBox(NULL, "Unexpected error creating Execution!", "Amazon.exe", MB_OK);
return 0;
}
DWORD ret = WaitForSingleObject(hHandle, 0);
if (ret != WAIT_OBJECT_0)
{
if (ret == WAIT_TIMEOUT)
MessageBox(NULL, "Game is already running 2 times, additional Execution is prohibited!", "Amazon.exe", MB_OK);
else
MessageBox(NULL, "Unexpected error waiting on Execution!", "Amazon.exe", MB_OK);
return 0;
}
// do your normal work...
ReleaseSemaphore(hHandle, 1, NULL);
return 0;
}