1. 使用Mutex内核对象
bool IsHaveAnotherProcess() { HANDLE hMutex = CreateMutex( NULL, FALSE, "ProcessA" ); if ( GetLastError() == ERROR_ALREADY_EXISTS ) { CloseHandle( hMutex ); AfxMessageBox( "程序已经启动" ); return false; } return true; }
先用 CreateMutex 来创建一个具名互斥量,若是创建成功返回一个互斥量对象的句柄; 反之,函数返回这个已经存在的互斥量的句柄,并 GetLastError() 返回错误代码 ERROR_ALREADY_EXISTS。
事实上,这是利用了windows内核对象的知识。命名的内核对象属于全局可访问的,唯一的,当创建一个命名的内核对象时 ( Create* ),系统会先检查内核里是否有这个对象,有则返回这个对象的句柄,无则创建一个。