我有一个Windows应用程序。我想为单个用户会话允许多个实例,但我不希望来自不同用户的多个实例。简单来说,如果A登录到Windows,那么他可以运行应用程序尽可能多的实例,但稍后,B登录,他应该等到A的所有应用程序都关闭。
这可能吗?
答案 0 :(得分:1)
此要求可以使用全局Mutex Object中的命名Kernel Object Namespace来完成。使用CreateMutex function创建互斥对象。这是一个小程序来说明它的用法:
int _tmain(int argc, _TCHAR* argv[]) {
if ( ::CreateMutexW( NULL,
FALSE,
L"Global\\5BDC0675-2318-404A-96CA-DBDE9BC2F71D" ) != NULL ) {
auto const err{ GetLastError() };
std::wcout << L"Mutex acquired. GLE = " << err << std::endl;
// Continue execution
} else {
auto const err{ GetLastError() };
std::wcout << L"Mutex not acquired. GLE = " << err << std::endl;
// Exit application
}
_getch();
return 0;
}
第一个应用程序实例将创建互斥对象,GetLastError将返回ERROR_SUCCESS
(0)。后续实例将获取对现有互斥对象的引用,GetLastError将返回ERROR_ALREADY_EXISTS
(183)。从另一个客户端会话启动的实例将不会获取对互斥锁对象的引用,并且GetLastError将返回ERROR_ACCESS_DENIED
(5)。
关于实施的一些注释:
答案 1 :(得分:-1)
我在win10 / VS 2017/64位下使用了以前的代码
针对if(:: CreateMutex ..
我们必须检查错误,所以使用:
BOOL checkUniqueInstance()
{
if (::CreateMutexW(NULL,
FALSE,
L"Global\\27828F4B-5FC9-40C3-9E81-6C485020538F") != NULL) {
auto err = GetLastError();
if (err == 0) {
return TRUE;
}
}
CString msg;
msg.Format(_T("err: %d - Mutex NOT acquired"), GetLastError());
OutputDebugString(msg);
// Exit application
return FALSE;
}