2012-06-11 32 views
0

我有一個使用::CreateEvent創建命名事件的進程。檢查命名事件

在我的過程中,我想檢查事件是否存在,但我不想在事件不存在的情況下創建事件。

我該怎麼辦?

我能做到這樣,但後來的情況下將創建的事件不存在:

HANDLE hEvent; 
hEvent= ::CreateEvent(NULL, FALSE, FALSE, _T("MyEvent")); 
if (::GetLastError() != ERROR_ALREADY_EXISTS) 
{ 
    ....... 
} 

回答

3

OpenEvent,如果它不存在,創建事件,所以你的代碼已經幾乎做到了你想要的。您需要檢查錯誤代碼前檢查事件句柄NULL

HANDLE hEvent; 
hEvent= ::OpenEvent(FALSE, FALSE, _T("MyEvent")); 
if (!hEvent) // event does not already exist, or other problem 
{ 
    ....... 
} 
+0

對不起,我錯了。我改用「CreateEvent」而不是「OpenEvent」。 「OpenEvent」根本不適用於我,即使在事件存在的情況下,它也會返回NULL。我編輯了我的問題。 – user1439691

+2

檢查錯誤代碼。如果事件存在,但OpenEvent返回NULL,那麼還有另一個問題。這可能是一個權限錯誤---如果事件是由另一個進程創建的,那麼您可能沒有正確的權限來訪問它,特別是如果其他進程是服務或其他系統進程,或者由其他用戶運行。 –

1
CString csHandleName = "hEvent"; 
int nHandleinc(0); 
HANDLE hHandleEvent = NULL; 
while(!hHandleEvent) 
{ 
    csHandleName.Format("hEvent%d",nHandleinc); 
    hHandleEvent = CreateEvent(NULL,TRUE,false,csHandleName); 
    if (GetLastError() == ERROR_ALREADY_EXISTS) 
    { 
    CloseHandle(hHandleEvent); 
    hHandleEvent = NULL; 
    } 
    nHandleinc++; 
}