Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关闭句柄/存储句柄_C++_Windows_Handle - Fatal编程技术网

C++ 关闭句柄/存储句柄

C++ 关闭句柄/存储句柄,c++,windows,handle,C++,Windows,Handle,我有一些事件句柄,并将它们添加到列表中。我想知道我是否可以存储这些句柄,关闭本地句柄,以后仍然使用存储的句柄 例如: std::map<std::string, HANDLE> Events; DWORD OpenSingleEvent(std::string EventName, bool InheritHandle, DWORD dwDesiredAccess, DWORD dwMilliseconds) { Handle hEvent = OpenEvent(dwDe

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

例如:

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;
}
std::映射事件;
DWORD OpenSingleEvent(std::string EventName、bool InheritHandle、DWORD dwDesiredAccess、DWORD DWMS)
{
Handle-hEvent=OpenEvent(dwDesiredAccess,InheritHandle,EventName.c_str());//本地句柄。
如果(hEvent)
{
DeleteSingleEvent(EventName);//删除映射中的正确/旧句柄。
insert(EventName,hEvent);//将这个新句柄添加到映射中。
DWORD结果=WaitForSingleObject(hEvent,dwms);
CloseHandle(hEvent);//关闭这个句柄。不是我地图上的那个。
返回结果;
}
CloseHandle(hEvent);//关闭此句柄。
返回等待失败;
}
上述方法有效吗?如果没有,还有其他方法吗?它用于共享内存通信,因此我不能复制句柄,因为我只有客户端PID,而没有服务器的PID


还有人能解释一下继承句柄的作用吗?我使用的函数是OpenEvent,它有那个参数,但我不确定它是做什么的。

一个
句柄
只是一个
void*
,它是一个令牌,实际上代表内核空间中的一个对象。调用
CloseHandle
实际上是释放内核对象,因此问题的简短答案是否定的,您不能保留它们的列表,然后关闭所有本地对象。您所拥有的只是一个列表,其中包含的
void*
并不代表任何内容


您可以使用
DuplicateHandle
,它实际上代表您创建了另一个内核对象。然而。。。为什么不在处理完列表中的条目后关闭句柄呢?

我还应该指出,在您的问题中,您正在调用
CloseHandle
,即使事件为
NULL
。这不会造成任何伤害,但毫无意义。句柄列表代表事件列表,我想我可以关闭本地句柄,然后将ResetEvent与列表中的句柄一起使用,等等。。我想在那里关上它是没用的。我只是不喜欢把手一直开着的想法。inherit handle还有什么作用?@CantChooseServerNames一旦调用了
CloseHandle
,就再也没有可调用的事件了。物体不见了。您可以存储任意多个
句柄副本
,但实际上内核中只有一个对象。