私のアプリケーションでは、読み取り/書き込みを行う共有メモリへのハンドルを開きます。次のようにハンドルを開きます。
//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 に設定され、このメソッドを呼び出すコードはシングル スレッドのみであるため、これを呼び出すのは 1 回だけです。ただし、呼び出すと、次の警告が表示されます。
「FMLib_Comm_Layer.exe の 0x7c90e4ff (ntdll.dll) での初回例外: 0xC0000008: 無効なハンドルが指定されました。」
警告のために中断すると、閉じようとしているハンドルの値が「0x01c90000」であることがわかります。これは、共有メモリ ポインターとしては妥当と思われます。この実装に問題がある人はいますか?