HANDLE mutex = ::CreateMutex(Q_NULLPTR,true,(LPCWSTR)qApp->applicationName().toStdWString().c_str()); if(GetLastError() == ERROR_ALREADY_EXISTS) { QMessageBox waringBox(QMessageBox::Warning,QStringLiteral("警告"),QStringLiteral("当前程序已运行,不能再次运行!")); waringBox.setButtonText(QMessageBox::Ok,QStringLiteral("确定")); waringBox.setStandardButtons(QMessageBox::Ok); waringBox.exec(); ::CloseHandle(mutex); return 0; } 上面代码可有效限制在windows10系统只能打开一个程序, 但是在windows Server2016系统中,由于有多个用户界面,不同用户界面依然可以打开多个程序, 请问如何限制在windows Server2016系统中,不管有多少个用户界面,也只能打开一个程序,请给我完整代码。
时间: 2024-02-19 17:57:51 浏览: 141
C--for-interview.rar_c 面试_site:www.pudn.com
以下是使用命名互斥体实现在 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)
{
// 释放互斥体
CloseHandle(hMutex);
// 显示警告框
MessageBox(nullptr, L"当前程序已经在运行,请不要重复打开!", L"警告", MB_ICONWARNING | MB_OK);
return 0;
}
// 继续运行程序
// 释放互斥体
CloseHandle(hMutex);
return 0;
}
```
在上面的代码中,我们使用了命名互斥体来实现限制只能打开一个程序。在程序中,我们首先创建一个命名互斥体,然后检查互斥体是否已经存在。如果互斥体已经存在,则说明已经有一个实例在运行,这时就释放当前互斥体并退出程序。如果互斥体不存在,则说明当前实例是第一个运行的实例,这时就可以继续运行程序。在程序退出时,我们需要释放互斥体。由于使用了命名互斥体,因此无论有多少个用户界面,都只能打开一个程序。
阅读全文