如何確保VC/MFC程序只運(yùn)行一個(gè)實(shí)例?
在很多項(xiàng)目中,需要確保一個(gè)進(jìn)程只運(yùn)行一次,比如串口、板卡等開發(fā)程序,由于資源是獨(dú)占的,所以只能運(yùn)行一次。下面介紹一種方法來實(shí)現(xiàn)這個(gè)功能。1. 聲明一個(gè)GUID首先需要在程序中聲明一個(gè)GUID,該GUI
在很多項(xiàng)目中,需要確保一個(gè)進(jìn)程只運(yùn)行一次,比如串口、板卡等開發(fā)程序,由于資源是獨(dú)占的,所以只能運(yùn)行一次。下面介紹一種方法來實(shí)現(xiàn)這個(gè)功能。
1. 聲明一個(gè)GUID
首先需要在程序中聲明一個(gè)GUID,該GUID將作為進(jìn)程的唯一標(biāo)識符??梢允褂靡韵麓a來聲明GUID:
```
static const GUID CDECL BASED_CODE _tlid
{ 0x12345678, 0x1234, 0x5678, { 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78 } };
```
2. 聲明一個(gè)句柄
接下來需要聲明一個(gè)句柄,作為全局標(biāo)識符??梢允褂靡韵麓a來聲明句柄:
```
HANDLE hMutex;
```
3. 在應(yīng)用程序的*App::InitInstance()函數(shù)中,加入以下代碼
在應(yīng)用程序的*App::InitInstance()函數(shù)中,需要加入以下代碼,來創(chuàng)建一個(gè)互斥體,并檢查是否已經(jīng)創(chuàng)建過。如果已經(jīng)創(chuàng)建過,則退出程序。
```
// 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()函數(shù)中,關(guān)閉句柄
在程序退出時(shí),需要關(guān)閉之前創(chuàng)建的句柄??梢允褂靡韵麓a來關(guān)閉句柄:
```
if (hMutex ! NULL)
{
::ReleaseMutex(hMutex);
::CloseHandle(hMutex);
hMutex NULL;
}
```
5. 測試程序
現(xiàn)在,你可以測試程序了。這個(gè)程序/進(jìn)程只能運(yùn)行一次。如果嘗試打開第二個(gè)實(shí)例,程序?qū)⒅苯油顺觥?/p>
結(jié)論
通過以上步驟,我們可以很容易地確保VC/MFC程序只運(yùn)行一個(gè)實(shí)例。這對于某些需要獨(dú)占資源的程序非常有用。