У меня есть несколько дескрипторов событий, и я добавляю их в список. Я хочу знать, смогу ли я сохранить эти маркеры, закрыть локальные и все еще использовать сохраненные позже.
Пример:
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, и у нее есть этот параметр, но я не уверен, что она делает.
HANDLE
это просто void *
это токен, который фактически представляет объект в пространстве ядра. призвание CloseHandle
фактически освобождает объект ядра, поэтому краткий ответ на ваш вопрос — нет, вы не можете сохранить их список, а затем закрыть все локальные. Все, что у вас будет, это список void*
которые ничего не представляют.
Что вы можете сделать, это использовать DuplicateHandle
который фактически создает другой объект ядра от вашего имени. Однако … почему бы просто не закрыть ручки, когда вы закончили с записью в списке?
Других решений пока нет …