利用具名互斥體的核心特性:系統確保同名互斥體在全域命名空間中僅存在一個。第二個實例嘗試建立同名互斥體時,CreateMutex 會回傳 ERROR_ALREADY_EXISTS 錯誤碼,藉此偵測並阻擋重複啟動。
使用 VC 安裝目錄 Common\Tools\GUIDGEN.EXE 產生 GUID,定義為巨集:
#define APP_GUID _T("{0xbe8e2ce1, 0xdab6, 0x11d6, 0xad, 0xd0, 0x0, 0xe0, 0x4c, 0x53, 0xf6, 0xe6}")
BOOL CEx1App::InitInstance()
{
m_hMutex = ::CreateMutex(NULL, FALSE, APP_GUID);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
AfxMessageBox(_T("應用程式已在運行中"));
return FALSE; // MFC 會終止應用程式啟動
}
// 正常初始化流程...
return TRUE;
}
int CEx1App::ExitInstance()
{
if (m_hMutex) CloseHandle(m_hMutex);
return CWinApp::ExitInstance();
}
| 語言/框架 | 核心方法 |
|---|---|
| Visual Basic | App.PrevInstance 屬性直接判斷 |
| Delphi / C++Builder | 同樣呼叫 CreateMutex API 實作 |
| .NET Framework | Mutex 類別配合 WaitOne(0) 非阻塞檢查 |
Global\\ 可跨工作階段限制(終端機服務環境),Local\\ 則限制於當前工作階段SECURITY_ATTRIBUTES 可控制互斥體存取權限此方案簡潔可靠,為 Windows 平台單一實例檢查的標準作法。