メモリマップドファイルを使用すると各アプリからデータの共有が可能になる.
(共有可能になるだけで,それなりの同期は各自が行わなければならない)
hShare = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL,
PAGE_READWRITE, 0, Size, "MyShare");
ptr = MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// 処理
UnmapViewOfFile(ptr);
CloseHandle(hShare);
各アプリが "MyShare" という名前でメモリマップドファイルをオープンすればよい.
匿名でメモリマップドファイルを作成してそのハンドルを継承すれば,共有名が偶然に合致してしまうことを回避出来るが,メモリマップドファイルを共有するプロセスはすべて親子(孫とかも含むので直系)である必要がある.
// メモリマップドファイルの作成
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; // これで HANDLE を継承可能にする
hShare = CreateFileMapping((HANDLE)0xFFFFFFFF, &sa,
PAGE_READWRITE, 0, Size, "MyShare");
// 子プロセスの作成
TCHAR szCmdLine[256];
sprintf(szCmdLine, "Hoge.exe -%x", hShare); // 例えば
CreateProcess(NULL, szCmdLine, NULL, NULL,
TRUE, // これで HANDLE が継承される
0, NULL, NULL, &si, &pi);
Hoge.exe 側でコマンドラインを解釈して,hShare 相当品を使用すれば,MapViewOfFile() に親プロセスと同じメモリマップドファイルを渡すことが出来る.
参照