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

實現程式單一實例運行的多種方法對比:VC、VB、Delphi 跨平台方案

     編輯:關於VC++

方法一:VC++ 共享資料段法 (編譯器特有)


// 定義共享資料段
#pragma data_seg("Shared")
int volatile g_lAppInstance = 0;
#pragma data_seg()
// 告知連結器:可讀、可寫、共享
#pragma comment(linker, "/section:Shared,RWS")

原理:所有進程實例映射同一物理記憶體頁面。InitInstance 中遞增計數,大於 1 即退出。


if (++g_lAppInstance > 1) {
    AfxMessageBox(_T("程式已在運行"));
    return FALSE;
}

優點:無核心物件開銷;缺點:VC 編譯器專屬,跨編譯器不通用。

方法二:具名互斥體法 (跨平台標準作法)


HANDLE hMutex = CreateMutex(NULL, FALSE, _T("Global\\MyUniqueAppName"));
if (GetLastError() == ERROR_ALREADY_EXISTS) {
    CloseHandle(hMutex);
    AfxMessageBox(_T("程式已在運行"));
    return FALSE;
}

優點:Win32 標準 API,VB (需 API 呼叫)、Delphi、C++Builder、.NET 皆適用;支援跨工作階段 (加 Global\\ 前綴)。

方法三:Visual Basic 內建屬性


Private Sub Form_Load()
    If App.PrevInstance Then
        MsgBox "程式已在運行!"
        Unload Me
    End If
End Sub

VB 執行期自動維護,最簡單但僅限 VB 應用。

方法四:Delphi / C++Builder 互斥體實作


// Delphi
var
  hMutex: THandle;
begin
  hMutex := CreateMutex(nil, False, 'MyUniqueAppName');
  if GetLastError = ERROR_ALREADY_EXISTS then begin
    CloseHandle(hMutex);
    Application.Terminate;
  end;
end;

C++Builder 同理呼叫 CreateMutex,無編譯器內建共享段機制。

比較總結表

方法適用範圍跨工作階段核心物件備註
共享資料段VC++ 專屬否無效能最佳,但不可移植
具名互斥體所有 Win32 語言是 (Global\\)Mutex標準推薦作法
VB PrevInstanceVB 6.0否內建最簡單,語言綁定
FindWindow所有語言視窗類別名唯一時無不穩定,易誤判

最佳實務建議

  1. 優先使用 具名互斥體 + Global\\ 前綴,通用性最強
  2. 互斥體名稱採用 GUID 確保全域唯一性
  3. 異常退出時系統自動釋放互斥體,無需額外清理
  4. 避免使用 FindWindow 檢查視窗標題,極易因版本、語系差異失效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved