首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

讓 VC 與 Delphi 程序僅運行單一實例的通用方法

     編輯:Delphi

核心原理:命名互斥體

調用 CreateMutex 創建一個全局唯一名稱的互斥對象。若已存在同名互斥體,GetLastError 返回 ERROR_ALREADY_EXISTS,說明程序已在運行,直接退出。

VC++ 實現 (WinMain 入口)

#include 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nShowCmd)
{
    const char* szAppName = "OnlyOneApp";
    HANDLE hMutex = CreateMutex(NULL, FALSE, szAppName);

    if (hMutex != NULL)
    {
        if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            MessageBox(NULL, TEXT("程序已在運行。"), TEXT("提示"), MB_OK | MB_ICONINFORMATION);
            CloseHandle(hMutex);
            return -1;
        }
    }
    else
    {
        MessageBox(NULL, TEXT("創建互斥體失敗。"), TEXT("錯誤"), MB_OK | MB_ICONERROR);
        return -1;
    }

    // 正常運行邏輯...
    MessageBox(NULL, TEXT("首次啟動。"), TEXT("提示"), MB_OK);

    CloseHandle(hMutex);
    return 0;
}

Delphi 實現 (專案源文件 .dpr)

program OnlyOne;

uses
  Windows,
  Forms,
  uMain in 'uMain.pas' {FormMain};

{$R *.res}

var
  hAppMutex: THandle;

begin
  Application.Initialize;

  // 創建互斥體,必須在 Application.Initialize 之後
  hAppMutex := CreateMutex(nil, False, 'OnlyOneApp');
  if (hAppMutex = 0) then
  begin
    MessageBox(0, '創建互斥體失敗!', '錯誤', MB_OK + MB_ICONERROR);
    Exit;
  end;

  // 檢查是否已存在
  if (hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
  begin
    MessageBox(0, '程序已在運行!', '提示', MB_OK + MB_ICONINFORMATION);
    CloseHandle(hAppMutex);
    Exit;
  end;

  Application.CreateForm(TFormMain, FormMain);
  Application.Run;

  // 程序結束時釋放
  CloseHandle(hAppMutex);
end.

關鍵點總結

  1. 互斥體名稱需全局唯一,建議使用 GUID 或公司+產品名。
  2. Delphi 中 CreateMutex 調用需在 Application.Initialize 之後,CloseHandle 在 Application.Run 之後。
  3. uses 子句中 Windows 必須在 Forms 之前。
  4. 適用於所有原生 Win32 應用,不依賴 VCL/MFC。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved