关闭手柄/存放手柄

时间:2012-10-18 15:20:12

标签: c++ windows handle

我有一些事件句柄,我将它们添加到列表中。我想知道我是否可以存储这些句柄,关闭本地句柄,然后仍然使用存储的句柄。

示例:

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,它有该参数,但我不确定它是做什么的。

1 个答案:

答案 0 :(得分:2)

HANDLE只是void *,它是一个实际上代表内核空间中对象的标记。调用CloseHandle实际上会释放内核对象,所以对你的问题的简短回答是否定的,你不能保留它们的列表然后关闭所有本地的。您所拥有的只是void*的列表,不代表任何内容。

您可以使用DuplicateHandle代表您实际创建另一个内核对象。但是......当你完成列表中的条目时,为什么不关闭句柄呢?