C++ CloseHandle调用的句柄异常无效?

C++ CloseHandle调用的句柄异常无效?,c++,windows,shared-memory,handles,C++,Windows,Shared Memory,Handles,在我的应用程序中,我打开了一个共享内存的句柄,可以读取/写入该内存。我这样打开把手: //Map the shared memory d_to_mbx_mem_arr[idx] = reinterpret_cast<Byte*>(MapViewOfFile(to_mem_h, // handle to map object FILE_MAP_ALL_ACCES

在我的应用程序中,我打开了一个共享内存的句柄,可以读取/写入该内存。我这样打开把手:

//Map the shared memory
     d_to_mbx_mem_arr[idx] = reinterpret_cast<Byte*>(MapViewOfFile(to_mem_h,    // handle to map object
                                                       FILE_MAP_ALL_ACCESS, // read/write permission
                                                       0,
                                                       0,
                                                       MAILBOX_SIZE_e));
由于CloseHandle之后该值被设置为NULL,并且调用该方法的代码只是单线程的,所以我知道我只调用了一次。但是,当我调用它时,我得到以下警告:

“FMLib_Comm_Layer.exe中0x7c90e4ff(ntdll.dll)处的首次意外异常:0xC0000008:指定了无效句柄。”


当我中断警告时,我看到它试图关闭的句柄的值为“0x01c90000”,这对于共享mem指针来说似乎是合理的。有人看到这个实现有问题吗,或者我应该假设我在其他地方搞砸了其他东西吗?

您需要在
上调用
CloseHandle()
来调用
,而不是在
MapViewOfFile()的返回值上调用
MapViewOfFile()
(参见使用
MapViewOfFile()的示例)
——该示例对
MapViewOfFile()
的返回值调用
UnmapViewOfFile()
,并对
MapViewOfFile()
的第一个参数调用
CloseHandle()

您需要在
上调用
CloseHandle()
,而不是在
MapViewOfFile()的返回值上调用
(请参见使用
MapViewOfFile()
的示例——该示例对
MapViewOfFile()
的返回值调用
UnmapViewOfFile()
,并对
MapViewOfFile()
的第一个参数调用
CloseHandle()

两个问题:(1)该句柄值是否与第一次获取句柄时得到的值相同?(2)是否调用
UnmapViewOfFile
,调用是否成功?[调用
UnmapViewOfFile
CloseHandle
的顺序无关紧要,但必须同时调用这两个值才能释放文件。不过,两者都应该成功。]两个问题:(1)句柄值是否与第一次获取句柄时得到的值相同?(2)是否调用
UnmapViewOfFile
,调用是否成功?[调用
UnmapViewOfFile
CloseHandle
的顺序无关紧要,但必须同时调用这两个函数才能释放文件。不过,这两个函数都应该成功。]好的,1个问题。实际上,我在映射文件视图后立即调用CloseHandle,即使我继续使用已映射的共享文件,这可以吗?事实上,这实际上是可以的。从
UnmapViewOfFile
文档:“尽管应用程序可能会关闭用于创建文件映射对象的文件句柄,但系统会保持相应的文件处于打开状态,直到文件的最后一个视图取消映射为止。”。"添加UnmapViewOfFile而不是CloseHandle似乎可以解决此问题。如果在仍然使用文件映射对象的情况下关闭文件句柄不合适,我会感到惊讶,因为我已经做了一段时间了,但没有发现任何问题。好的,1个问题。实际上,我在映射文件视图后立即调用CloseHandle到_mem_h,即使尽管我继续使用已映射的共享文件,这可以吗?事实上,这实际上是可以的。从
unmappviewoffile
文档中:“尽管应用程序可能会关闭用于创建文件映射对象的文件句柄,但系统会保持相应文件打开,直到文件的最后一个视图被取消映射。”添加UnmapViewOfFile而不是CloseHandle似乎可以解决这个问题。如果在仍然使用文件映射对象的情况下关闭文件句柄是不合适的,我会感到惊讶,因为我已经做了一段时间了,没有发现任何问题。
CloseHandle(d_to_mbx_mem_arr[p_tool_id]);
d_to_mbx_mem_arr[p_tool_id] = NULL;