0

私のアプリケーションでは、読み取り/書き込みを行う共有メモリへのハンドルを開きます。次のようにハンドルを開きます。

//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」であることがわかります。これは、共有メモリ ポインターとしては妥当と思われます。この実装に問題がある人はいますか?

4

1 に答える 1

4

の戻り値ではなく、CloseHandle()を呼び出す必要があります(ここでの使用例を参照してください。その例では、 の戻り値を呼び出し、 の最初のパラメーターを呼び出しています) 。to_mem_hMapViewOfFile()MapViewOfFile() UnmapViewOfFile()MapViewOfFile()CloseHandle()MapViewOfFile()

于 2012-06-05T18:34:12.710 に答える