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