共有メモリは、データの送受信を意味するものではありません。違反のないプロセス数に対して作成されたメモリです。そのためには、データが破損しないように、ロックなどのメカニズムに従う必要があります。
プロセス 1 で:
CreateFileMapping()
: 共有メモリ ブロックがまだ存在しない場合は、最後のパラメーターで指定された名前で共有メモリ ブロックを作成し、成功した場合はハンドル (ポインターと呼ぶこともできます) を返します。
MapViewOfFile()
: この共有ブロックをプロセス アドレス空間にマップ (インクルード) し、ハンドルを返します (ここでもポインタと言えます)。
によって返されたこのポインターMapViewOfFile()
を使用すると、その共有ブロックにアクセスできます。
プロセス 2 で:
OpenFileMapping()
: によって共有メモリ ブロックが正常に作成されたCreateFileMapping()
場合は、同じ名前 (共有メモリ ブロックの作成に使用された名前) で使用できます。
UnmapViewOfFile()
: マップを解除します (そのプロセス アドレス空間から共有メモリ ブロックを削除できます)。共有メモリの使用 (アクセス、変更など) が終了したら、この関数を呼び出します。
Closehandle()
: 最後にプロセスから共有メモリ ブロックをデタッチするには、引数、OpenFileMapping() または CreateFileMapping() によって返されるハンドルを指定してこれを呼び出します。
これらの関数は単純に見えますが、フラグが適切に選択されていない場合、動作はトリッキーです。共有メモリを読み書きする場合は in で指定PAGE_EXECUTE_READWRITE
しCreateFileMapping()
ます。
共有メモリを正常に作成した後でアクセスしたい場合はいつでも、 in を使用FILE_MAP_ALL_ACCESS
しMapViewOfFile()
ます。
FALSE
(親プロセスからハンドルを継承しない)を指定した方がOpenFileMapping()
混乱を避けることができます。