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;