用互斥(Mutex),Mutex本來是多線程同步用的,防止多個線程訪問同一資源而引發沖突。用CreateMutex可以創建Mutex對象,實質上是一個kernel對象。
在任何Win32程序(包括GDI和Console)的啟動部分加上以下代碼(Console程序的main函數、MFC程序的CWinApp派生類的InitInstance成員函數、RawSDK程序的WinMain 函數):
hMutex=CreateMutex(
NULL,//nosecurityattributes
FALSE,//initiallynotowned
"RunOnlyOneInstance");//命名Mutex是全局對象
//在所有的process都可以訪問到
if(hMutex==NULL||ERROR_ALREADY_EXISTS==::GetLastError())
{
//程序第二次或以後運行時,會得到Mutex已經創建的錯誤
returnFALSE;
}
嘿嘿,是不是不用FindWindow優雅簡潔多了?
另外,如果要限定程序同時可運行n個實例怎麼辦?
Tips:用信號量(Semaphore)。