delphi:只允许一个实例运行

用win32 API的CreateMutex来实现。

HANDLE CreateMutex(
    LPSECURITY_ATTRIBUTES  lpMutexAttributes,   // 指向安全属性的指针
    BOOL  bInitialOwner,   // 初始化互斥对象的所有者
    LPCTSTR  lpName   // 指向互斥对象名的指针
  );

例如:

var
  hMutex: HWND;   //主窗口句柄

  Ret: integer;   // 最后的错误代码,用来检测是否是一个实例运行

begin

//进程互斥,只允许一个实例运行

//主要根据第三个参数建立互斥指针,如果发现这个值已经存在,说明程序已经在运行,所以这个值必须具有唯一性

// 存在,则返回已有窗口句柄

hMutex := CREATEMUTEX(nil, FALSE, 'XXXXXX系统4B2LLLLMMDAAAAA-5DC34AF-12Z7-5TGB7U-9IJN0OK2445');
 Ret := GETLASTERROR;   //获得错误号,如果是多个实例,将会产生  183 这个值的错误号
if Ret = ERROR_ALREADY_EXISTS then        //ERROR_ALREADY_EXISTS 表示进程已经存在
begin
   setActiveWindow(hMutex);      //激活已有主窗口
  Application.Terminate;        // 当前程序终止
  exit;   //跳出当前代码块
end;




end.
posted @ 2020-03-16 16:07  huiy_小溪  阅读(253)  评论(0编辑  收藏  举报