CloseHandle调用上的句柄异常无效?

时间:2012-06-05 18:23:40

标签: 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_ACCESS, // read/write permission
                                                       0,
                                                       0,
                                                       MAILBOX_SIZE_e));

这里设置的变量是一个Byte *数组(Byte是unsigned char的别名),所以我做了一个重新解释转换,所以我可以像使用标准的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中0x7c90e4ff(ntdll.dll)的第一次机会异常:0xC0000008:指定了无效句柄。”

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

1 个答案:

答案 0 :(得分:4)

您需要在CloseHandle()上致电to_mem_h,而不是MapViewOfFile()的返回值(请参阅使用MapViewOfFile() here的示例 - 该示例在UnmapViewOfFile()的返回值上调用MapViewOfFile(),并在CloseHandle()的第一个参数上调用MapViewOfFile()