目的:让目标程序在内存中只有一个实例

Q:为什么要实现这个目的??

A:因为有些程序 需要使用电脑上面的硬件,比如串口 采集卡之类的。这样情况下,程序在内存里面就只能

有一份,不然会抢夺硬件资源,造成各种问题。

××××××××××××××××××××××

实现这个目的可能有很多种方式。不过此处我要使用的是CreateMutex()这个函数。

这个函数被定义在Kernel32里面。这个中文意译就是创建一个互锁。

函数原型:

HANDLE CreateMutex( 
  LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针 
  BOOL bInitialOwner, // 初始化互斥对象的所有者 
  LPCTSTR lpName // 指向互斥对象名的指针 
  );

  
  创建一个 互斥体(MUTEX) 
  返回值 
  Long,如执行成功,就返回互斥体对象的句柄;

零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 
  参数表 
  参数 类型及说明 


  lpMutexAttributes SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 


  bInitialOwner Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 


  lpName String,指定互斥体对象的名字。用vbNullString创建一个 未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符

××××××××××××××××××××××

范例1:

//设置应用程序只允许一个实例****************************************************
 	HANDLE m_hMutex=CreateMutexA(NULL,TRUE, m_pszAppName); 
    if(GetLastError()==ERROR_ALREADY_EXISTS) 
	{ 
		AfxMessageBox("程序已启动");
		CloseHandle(m_hMutex);
		m_hMutex  = NULL;
		return FALSE; 
	}
 	//设置应用程序只允许一个实例结束************************************************

 

m_pszAppName是程序运行名字,m_pszAppName是const char* 类型的公有变量。

 

×××××××××××××××××××××××

范例2:

h_mutex1=CreateMutex(NULL,FALSE,"mutex_for_readcount");//创建一个互斥体 
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");// 检查错误代码 
if (GetLastError() == ERROR_ALREADY_EXISTS) 
{ 
  // 如果已有 互斥量存在则释放句柄并复位互斥量 
  CloseHandle(m_hMutex); 
  m_hMutex = NULL; 
  // 程序退出 
  return FALSE; 
}; 

  

×××××××××××××××××××××××××

原文地址:https://www.cnblogs.com/wenluderen/p/4770485.html