Delphi数据库编程

delphi 程序全局互斥

2019-07-13  本文已影响0人  bshoes

    通常我们为了防止程序重复启动,就会建立互斥对象。下面这种方式在普通机器上面是起作用的。 

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;

上一篇 下一篇

猜你喜欢

热点阅读