功能:
CreateMutex() 用於有獨占要求的程序 (在其進程運行期間不允許其他使用此端口設備的程序運行,或不允許同名程序運行)。
比如運行金山詞霸時,一次只能運行一個實例,當運行第二個實例時,實際上是激活第一個實例,將其帶到最頂層。
原型:
1 HANDLE CreateMutex( 2 LPSECURITY_ATTRIBUTES lpMutexAttributes, 3 BOOL bInitialOwner, 4 LPCTSTR lpName 5 );
參數:
lpMutexAttributes:必須為NULL
bInitialOwner:如果為TRUE,調用互斥對象的線程獲得互斥對象的所有權
如果為FALSE,則不擁有
lpName:如果lpName跟一個已存在的事件、信號、文件映射對象匹配,即命名的互斥對象已存在,則CreateMutex函數失敗,GetLastError()返回ERROR_INVALID_HANDLE。
注解:
一旦不再需要,注意必須用CloseHandle函數將互斥體句柄關閉。從屬於它的所有句柄都被關閉后,就會刪除對象。
進程中止前,一定要釋放互斥體(ReleaseMutex(HANDLE)),如不慎
未采取這個措施,就會將這個互斥體標記為廢棄,並自動釋放所有權。共享這個互斥體的其他
應用程序也許仍然能夠用它,但會接收到一個廢棄狀態信息,指出上一個所有進程未能正常關閉。
代碼:
1 BOOL CBBBApp::SetMutex() 2 { 3 BOOL bFound = FALSE; 4 5 HANDLE hMutexOneInstance = ::CreateMutex(NULL, TRUE, _T("MutexBBB")); 6 7 if (::GetLastError() == ERROR_ALREADY_EXISTS) 8 { 9 TRACE(_T("Instance對象已存在")); 10 11 bFound = TRUE; 12 CloseHandle(hMutexOneInstance); 13 hMutexOneInstance = NULL; 14 } 15 16 if (hMutexOneInstance) 17 { 18 ::ReleaseMutex(hMutexOneInstance); 19 } 20 21 if (bFound) 22 { 23 return FALSE; 24 } 25 26 return TRUE; 27 }