bool bFound = false;
m_hMutexOneInstantance=CreateMutex(NULL,TRUE,_T("PreventSecondInstance"));
if(GetLastError()==ERROR_ALREADY_EXISTS)
bFound=TRUE;
if(m_hMutexOneInstantance)
ReleaseMutex(m_hMutexOneInstantance);
if (bFound==TRUE)
{
::AfxMessageBox("已经有一个程序在运行");
return false;
}
解决方案 »
- windows 窗口过程lParam参数的,高低两个宏定义.
- 今天中关村图书大厦,看书有感
- WNDCLASS.cstyle是否指定CS_HREDRAW|CS_VREDRAW,对功能有什么影响么?
- 关于编译时的dll问题
- 高手何在!!!!!!!!!急!!!!!!!!!!
- 按一键关ie窗口问题?高手请进。
- 我是低低手,请问struct是啥意思?
- 请问这个类模板什么意思?
- _int64怎样转化成float型
- MFC怎么用线程来保存数据啊
- 急!!!!!!!!请问在主对话框里添加一个按钮,点击按钮弹出一个子对话框,如何让子对话框里的静态控件的字体是透明的?????
- 如何在对话框中创建视图,视图继承自CScrollView类,急!急!快来参观啊
放在客户端的 InitInstance()函数里,运行第一个 就GetLastError()==ERROR_ALREADY_EXISTS了 ,为啥啊?
CreateMutex(NULL,TRUE,_T("PreventSecondInstance2"));//也不行!
把服务端提示关了就不会了。
也可以把最后一个参数的名字改了。
这个作用区域是当前登陆用户,可以看做是全系统的,如果你服务端开着就已经创建了这个互斥Mutex,这时候你再客户端创建互斥就会GetLastError返回已创建
代码从上往下执行
运行第一个实例 ReleaseMutex 就释放了
运行第二个 GetLastError()==ERROR_ALREADY_EXISTS 咋知道的啊第一个不都释放了吗!
代码从上往下执行
运行第一个实例 ReleaseMutex 就释放了
运行第二个 GetLastError()==ERROR_ALREADY_EXISTS 咋知道的啊第一个不都释放了吗!
这个是GetLastError函数的功能。大部分API都会在调用之后设置LastError,你可以把他当做从一个static DWORD里面取值,只要你之间没有再次调用任何API,包括隐式调用的例如fopen,这个GetLastError都不会改变。
你也可以直接使用SetLastError设置这个值。
ReleaseMutex只是释放Mutex信号,功能相当于ResetEvent。你去查一下ResetEvent,SetEvent,PlushEvent,等等函数的功能。
你的CreateMutex第二个参数是TRUE,表示创建时有信号,其实你使用GetLatError判断是不需要ReleaseMutex函数的,直接把这句删了是一样的效果。