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;
}

解决方案 »

  1.   

    我从服务端在 InitInstance()函数里移植出来,服务端用的这段代码 好好的。
    放在客户端的 InitInstance()函数里,运行第一个  就GetLastError()==ERROR_ALREADY_EXISTS了 ,为啥啊?
    CreateMutex(NULL,TRUE,_T("PreventSecondInstance2"));//也不行!
      

  2.   

    很简单,你的服务端开着的。
    把服务端提示关了就不会了。
    也可以把最后一个参数的名字改了。
    这个作用区域是当前登陆用户,可以看做是全系统的,如果你服务端开着就已经创建了这个互斥Mutex,这时候你再客户端创建互斥就会GetLastError返回已创建
      

  3.   

    有可能是在调试器里面测试的,调试器有一个问题,创建的Mutex不会随着进程的关闭而关闭,如果没有显示调用CloseHandle的话
      

  4.   

    有可能是在调试器里面测试的,调试器有一个问题,创建的Mutex不会随着进程的关闭而关闭,如果没有显示调用CloseHandle的话
      

  5.   

    我改错了 的确是最后一个参数名字改了就行但是我不太明白啊
    代码从上往下执行
    运行第一个实例 ReleaseMutex 就释放了
    运行第二个  GetLastError()==ERROR_ALREADY_EXISTS 咋知道的啊第一个不都释放了吗!
      

  6.   

    我改错了 的确是最后一个参数名字改了就行但是我不太明白啊
    代码从上往下执行
    运行第一个实例 ReleaseMutex 就释放了
    运行第二个 GetLastError()==ERROR_ALREADY_EXISTS 咋知道的啊第一个不都释放了吗!
      

  7.   


    这个是GetLastError函数的功能。大部分API都会在调用之后设置LastError,你可以把他当做从一个static DWORD里面取值,只要你之间没有再次调用任何API,包括隐式调用的例如fopen,这个GetLastError都不会改变。
    你也可以直接使用SetLastError设置这个值。
      

  8.   


    ReleaseMutex只是释放Mutex信号,功能相当于ResetEvent。你去查一下ResetEvent,SetEvent,PlushEvent,等等函数的功能。
    你的CreateMutex第二个参数是TRUE,表示创建时有信号,其实你使用GetLatError判断是不需要ReleaseMutex函数的,直接把这句删了是一样的效果。