MFC如何判斷一個程序已經存在
阿新 • • 發佈:2019-02-04
通俗的講,CreateMutex就是用來判定是否存在一個指定的程序。呵呵,這樣就很好理解了。【MFC】判斷一個指定的程序是否存在--CreateMutex()
CreateMutex()
說明:
建立一個互斥體(MUTEX)
返回值:
Long,如執行成功,就返回互斥體物件的控制代碼;
零表示出錯。會設定GetLastError。即使返回的是一個有效控制代碼,但倘若指定的名字已經存在,GetLastError也會設為ERROR_ALREADY_EXISTS
引數表
引數 型別及說明
lpMutexAttributes SECURITY_ATTRIBUTES,指定一個SECURITY_ATTRIBUTES結構,或傳遞零值(將引數宣告為ByVal As Long,並傳遞零值),表示使用不允許繼承的預設描述符.
bInitialOwner Long,如建立程序希望立即擁有互斥體,則設為TRUE。一個互斥體同時只能由一個執行緒擁有
lpName String,指定互斥體物件的名字。用vbNullString建立一個未命名的互斥體物件。如已經存在擁有這個名字的一個事件,則開啟現有的已命名互斥體。這個名字可能不與現有的事件、訊號機、可等待計時器或檔案對映相符
註解:
一旦不再需要,注意必須用CloseHandle函式將互斥體控制代碼關閉。從屬於它的所有控制代碼都被關閉後,就會刪除物件程序中止前,一定要釋放互斥體,如不慎未採取這個措施,就會將這個互斥體標記為廢棄,並自動釋放所有權。共享這個互斥體的其他應用程式也許仍然能夠用它,但會接收到一個廢棄狀態資訊,指出上一個所有程序未能正常關閉。這種狀況是否會造成影響取決於涉及到的具體應用程式
---------------------------------------------------------------------
xxx::OnInitDialog() //xxx::InitInstance()
{
HANDLE dlgHandle = ::CreateMutex( NULL, FALSE, _T("ProcessTest.exe"));
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
AfxMessageBox("該應用程式已經存在!");
this->EndDialog( 1 ); // return FALSE;
}
CloseHandle( dlgHandle );
}
建立互斥體可以在App類的InitInstance中,也可以在Dlg類的OnInitDialog中,不過推薦在前者中建立。當然,一定要在生成對話方塊之前才有效。