标签:
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; };
×××××××××××××××××××××××××
标签:
原文地址:http://www.cnblogs.com/wenluderen/p/4770485.html