上面的代码不可行,可给我另外 的完整代码
时间: 2024-02-29 10:53:00 浏览: 9
非常抱歉,上面的代码确实存在问题。以下是针对 Windows Server 2016 的一个可行实现:
```
#include <Windows.h>
#include <string>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HANDLE hMutex = nullptr;
std::wstring mutexName = L"Global\\MyAppMutex";
// 创建命名互斥体
hMutex = CreateMutex(nullptr, FALSE, mutexName.c_str());
if (hMutex == nullptr)
{
MessageBox(nullptr, L"无法创建互斥体", L"错误", MB_ICONERROR | MB_OK);
return 1;
}
// 检查互斥体是否已经存在
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
MessageBox(nullptr, L"已有一个实例在运行", L"提示", MB_ICONINFORMATION | MB_OK);
CloseHandle(hMutex);
return 0;
}
// 继续运行程序
// 释放互斥体
CloseHandle(hMutex);
return 0;
}
```
在上面的代码中,我们以“Global\”前缀来创建命名互斥体,以确保其能够被多个用户界面访问。在程序启动时,我们首先创建一个命名互斥体,然后检查互斥体是否已经存在。如果互斥体已经存在,则说明已经有一个实例在运行,这时就关闭当前互斥体并退出程序。如果互斥体不存在,则说明当前实例是第一个运行的实例,这时就可以继续运行程序。在程序退出时,我们需要释放互斥体。
阅读全文