如何確保VC/MFC程序只運行一個實例?
在很多項目中,需要確保一個進程只運行一次,比如串口、板卡等開發程序,由于資源是獨占的,所以只能運行一次。下面介紹一種方法來實現這個功能。1. 聲明一個GUID首先需要在程序中聲明一個GUID,該GUI
在很多項目中,需要確保一個進程只運行一次,比如串口、板卡等開發程序,由于資源是獨占的,所以只能運行一次。下面介紹一種方法來實現這個功能。
1. 聲明一個GUID
首先需要在程序中聲明一個GUID,該GUID將作為進程的唯一標識符??梢允褂靡韵麓a來聲明GUID:
```
static const GUID CDECL BASED_CODE _tlid
{ 0x12345678, 0x1234, 0x5678, { 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78 } };
```
2. 聲明一個句柄
接下來需要聲明一個句柄,作為全局標識符??梢允褂靡韵麓a來聲明句柄:
```
HANDLE hMutex;
```
3. 在應用程序的*App::InitInstance()函數中,加入以下代碼
在應用程序的*App::InitInstance()函數中,需要加入以下代碼,來創建一個互斥體,并檢查是否已經創建過。如果已經創建過,則退出程序。
```
// Create a mutex with a name based on the GUID
CString strMutexName;
(_T("Global%s"), _tlid);
hMutex ::CreateMutex(NULL, TRUE, strMutexName);
if (ERROR_ALREADY_EXISTS ::GetLastError())
{
// The mutex already exists, so another instance is running.
TRACE(_T("Application instance already running
"));
return FALSE;
}
```
4. 在*App::ExitInstance()函數中,關閉句柄
在程序退出時,需要關閉之前創建的句柄??梢允褂靡韵麓a來關閉句柄:
```
if (hMutex ! NULL)
{
::ReleaseMutex(hMutex);
::CloseHandle(hMutex);
hMutex NULL;
}
```
5. 測試程序
現在,你可以測試程序了。這個程序/進程只能運行一次。如果嘗試打開第二個實例,程序將直接退出。
結論
通過以上步驟,我們可以很容易地確保VC/MFC程序只運行一個實例。這對于某些需要獨占資源的程序非常有用。