[ C++で開発 ]

Windowsで共有メモリを扱う

共有メモリは、同一マシン上で複数のプロセスの間で共有されるメモリ領域です。普通、プロセス毎に独立した論理アドレス空間(プロセス空間)が割り当てられるので、プロセスから見えるメモリは他のプロセスからはアクセスできません。プロセス間でデータの授受ができるように、プロセス空間とは別な領域にメモリを割り当て、ここを複数のプロセスからアクセスできるようにしたものが共有メモリです。

メモリマップドファイル

使用するAPI

Win32APIを使用する場合

API名
CreateFile
CreateFileMapping
MapViewOfFile
UnmapViewOfFile
CloseHandle

※双方のプロセスでCreateFileMapping()を行う必要がある。

CreateFileMapping
HANDLE CreateFileMapping(
        HANDLE hFile,
        LPSECURITY_ATTRIBUTES SecurityAttr
        DWORD Protect,
        DWORD MaxSizeHigh,
        DWORD MaxSizeLow,
        LPCTSTR MapName);

hFileはCreateFileで生成されたファイルハンドルだが、0xffffffffを指定した場合はページングファイル上のメモリ領域が使用される。即ち共有メモリである。作成するファイルマッピングのサイズは64bit指定なので、上位32bitをMaxSizeHighで、下位32bitをMaxSizeLowで指定する。ただし、両方を0指定すると、hFileで指定したファイルのサイズとなる。従って、サイズが0のファイルへマッピングしようとするとエラーとなる。また、共有メモリとして0xffffffffを指定した場合は0とは指定できない。

MFCを使用する場合

CMemFile

別プロセスのメモリ空間へアクセス

共有メモリとは別な方式ですが、プロセス間でメモリを介したデータ授受を行う方法として、Win32APIのVirtualAllocExを使用することができます。これを使うと、あるプロセスのメモリ空間を別なプロセスから使用できます。