关闭句柄调用上的句柄异常无效

Invalid handle exception on CloseHandle call?

本文关键字:异常 无效 句柄 调用 关闭句柄      更新时间:2023-10-16

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

//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));

这里设置的变量是一个 Byte* 数组(Byte 是无符号字符的别名),所以我做了一个重新解释转换,这样我就可以像使用标准 Byte 指针一样使用句柄。

稍后我尝试通过以下方式释放句柄:

CloseHandle(d_to_mbx_mem_arr[p_tool_id]);
d_to_mbx_mem_arr[p_tool_id] = NULL;

由于该值在 CloseHandle 之后设置为 NULL,并且调用此方法的代码只是单线程的,我知道我只调用一次。但是,当我调用它时,我收到以下警告:

"FMLib_Comm_Layer.exe:0xC0000008:指定了无效句柄的0x7c90e4ff (ntdll.dll) 的首次机会异常。"

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

你需要

to_mem_h上调用CloseHandle(),而不是在MapViewOfFile()的返回值上调用(请参阅此处使用MapViewOfFile()的示例 - 该示例在MapViewOfFile()的返回值上调用UnmapViewOfFile(),并在第一个参数上调用CloseHandle()MapViewOfFile()