CreateMutex() 、ReleaseMutex()

功能

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 }
原文地址:https://www.cnblogs.com/SnailProgramer/p/4235310.html