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

確保應用程式單一實例運行的互斥體方案

     編輯:關於VC++

核心原理

利用具名互斥體的核心特性:系統確保同名互斥體在全域命名空間中僅存在一個。第二個實例嘗試建立同名互斥體時,CreateMutex 會回傳 ERROR_ALREADY_EXISTS 錯誤碼,藉此偵測並阻擋重複啟動。

Visual C++ 實作步驟

1. 產生唯一 GUID 識別碼

使用 VC 安裝目錄 Common\Tools\GUIDGEN.EXE 產生 GUID,定義為巨集:

#define APP_GUID _T("{0xbe8e2ce1, 0xdab6, 0x11d6, 0xad, 0xd0, 0x0, 0xe0, 0x4c, 0x53, 0xf6, 0xe6}")

2. 初始化階段檢查與建立互斥體

BOOL CEx1App::InitInstance()
{
    m_hMutex = ::CreateMutex(NULL, FALSE, APP_GUID);
    if (GetLastError() == ERROR_ALREADY_EXISTS) {
        AfxMessageBox(_T("應用程式已在運行中"));
        return FALSE; // MFC 會終止應用程式啟動
    }
    // 正常初始化流程...
    return TRUE;
}

3. 程式結束時釋放互斥體

int CEx1App::ExitInstance()
{
    if (m_hMutex) CloseHandle(m_hMutex);
    return CWinApp::ExitInstance();
}

跨語言實作對照

語言/框架核心方法
Visual BasicApp.PrevInstance 屬性直接判斷
Delphi / C++Builder同樣呼叫 CreateMutex API 實作
.NET FrameworkMutex 類別配合 WaitOne(0) 非阻塞檢查

進階考量

  • 全域 vs 本地:互斥體名稱前綴 Global\\ 可跨工作階段限制(終端機服務環境),Local\\ 則限制於當前工作階段
  • 安全性描述元:傳遞 SECURITY_ATTRIBUTES 可控制互斥體存取權限
  • 殘留處理:異常終止時互斥體會由系統自動釋放,無需擔心死鎖

此方案簡潔可靠,為 Windows 平台單一實例檢查的標準作法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved