通常我们为了防止程序重复启动,就会建立互斥对象。下面这种方式在普通机器上面是起作用的。
myMutex:=CreateMutex(nil, False, 'XXX');
if WaitForSingleObject(myMutex,0)=Wait_TimeOut then
begin
Application.MessageBox('当前程序已经运行,不能再次打开!','警告', MB_OK OR MB_ICONEXCLAMATION);
Application.Terminate;
Exit;
end;
但是服务器上这样使用互斥并不完全起作用,服务器不同用户可以各自启动程序。在进程里有多个相同名字的进程。这个时候我们就要用到全局互斥。用法如下:
const
CSMutexName = 'Global\XXX';
var
OneInstanceMutex: THandle;
SecMem: SECURITY_ATTRIBUTES;
aSD: SECURITY_DESCRIPTOR;
InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@aSD, True, nil, False);
SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES);
SecMem.lpSecurityDescriptor := @aSD;
SecMem.bInheritHandle := False;
OneInstanceMutex := CreateMutex(@SecMem, False, CSMutexName);
if (GetLastError = ERROR_ALREADY_EXISTS)then
begin
Application.MessageBox('当前程序已经运行,不能再次打开!',
'警告', MB_OK OR MB_ICONEXCLAMATION);
Application.Terminate;
Exit;
end;