当一个进程被某个service启动后,他的启动用户为system,如果这个进程是希望单实例运行的,判断如下
hMutex = CreateMutex(NULL, FALSE, "Name");
if( GetLastError == ERROR_ALREADY_EXISTS)
{
已经存在运行实例
}
如果启动这个进程的是普通用户,比如administrator,那么在执行到CreateMutex时,GetLastError返回的是ERROR_ACCESS_DENIED,被禁止访问,hMutex返回0,这个时候将对启动多个实例了。
是否做ERROR_ACCESS_DENIED判断???
可以如下方式建立Mutex,可以避免以上问题。
var
hMutex: THandle;
sa: _SECURITY_ATTRIBUTES;
sd: SECURITY_DESCRIPTOR;
begin
InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, True, nil, False);
sa.nLength := SizeOf(_SECURITY_ATTRIBUTES);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := @sd;
hMutex := CreateMutex(@sa, False, PChar('name'));
end;
SYSTEM下建立的默认描述符普通用户无法访问。