在我的应用程序中,我打开了一个对我读/写的共享内存的句柄。我像这样打开手柄:
//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指针来说似乎是合理的。有没有人看到这个实现有问题,或者我应该假设我已经把其他东西搞砸了?
答案 0 :(得分:4)
您需要在CloseHandle()
上致电to_mem_h
,而不是MapViewOfFile()
的返回值(请参阅使用MapViewOfFile()
here的示例 - 该示例在UnmapViewOfFile()
的返回值上调用MapViewOfFile()
,并在CloseHandle()
的第一个参数上调用MapViewOfFile()