2012-10-18 119 views
1

我有一些事件句柄,我將它們添加到列表中。我想知道是否可以存儲這些手柄,關閉本地手柄,然後再使用存儲手柄。關閉手柄/存儲手柄

例子:

std::map<std::string, HANDLE> Events; 

DWORD OpenSingleEvent(std::string EventName, bool InheritHandle, DWORD dwDesiredAccess, DWORD dwMilliseconds) 
{ 
    Handle hEvent = OpenEvent(dwDesiredAccess, InheritHandle, EventName.c_str()); //Local Handle. 
    if (hEvent) 
    { 
     DeleteSingleEvent(EventName); //Delete the correct/old handle in the map. 
     Events.insert(EventName, hEvent); //Add this new handle to the map. 
     DWORD Result = WaitForSingleObject(hEvent, dwMilliseconds); 
     CloseHandle(hEvent); //Close THIS handle. Not the one in my Map. 
     return Result; 
    } 
    CloseHandle(hEvent); //Close this handle. 
    return WAIT_FAILED; 
} 

請問上面的工作?如果沒有,是否有另一種方法來做到這一點?它用於共享內存通信,所以我不能複製句柄,因爲我只有客戶端PID而不是服務器。

也可以有人解釋什麼InheritHandle做?我使用的函數是OpenEvent,它具有該參數,但我不確定它的作用。

回答

2

A HANDLE只是一個void *,它是一個實際表示內核空間中的對象的標記。調用CloseHandle實際上會釋放內核對象,因此對您的問題的簡短回答是否定的,您不能保留它們的列表,然後關閉所有本地對象。所有你會有一個void*列表不代表什麼。

您可以做的是使用DuplicateHandle,它實際上代表您創建另一個內核對象。但是......爲什麼不在完成列表中的條目時關閉句柄?

+0

我也應該指出,在你的問題中,即使事件是NULL,你也調用'CloseHandle'。這不會造成任何傷害,但毫無意義。 – Benj

+0

Handles的列表代表事件列表,我想我可以關閉本地的,然後使用ResetEvent和列表中的那個,等等。 這是一種無用的關閉它,我猜。我只是不喜歡把手柄打開的想法。還有什麼繼承手柄呢? – Brandon

+0

@CantChooseUsernames一旦你調用了'CloseHandle',就沒有事件再打開'ResetEvent'了。物體已經消失。您可以根據需要存儲儘可能多的'HANDLE'副本,但是在內核中只有一個對象。 – Benj