Last Updated 2002/10/31
Windows
メモリマップドファイル
2002/10/31

メモリマップドファイルを使用すると各アプリからデータの共有が可能になる.
(共有可能になるだけで,それなりの同期は各自が行わなければならない)


    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() に親プロセスと同じメモリマップドファイルを渡すことが出来る.


参照
前後のTips
メモリマップドファイル

DSS ProgrammingTipsCGI Ver1.02