プログラミングメモ →目次

ファイルマッピングにより共有メモリ作成(VC++)

CreateFileMapping()APIで、複数のプロセスから同時にアクセスできる共有メモリを作れます。プロセス間のデータ通信に便利です。

1.CreateFileMapping()APIで、メモリ上でマップドファイルを作成します。マップドファイルが既に存在している場合でも、CreateFileMapping()APIは失敗しなく、メモリに関連付けるハンドルを作ってくれます。MapViewOfFile()APIで、メモリのアドレスを取得します。例:

#define MAP_FILENAME "_MapName_xxxxxx"
#define DATA_SIZE 1024
HANDLE hMapFile = (HANDLE)0xFFFFFFFF;
LPVOID lpMem = NULL;

void CreateMapFileTest_Test()
{
    hMapFile = ::CreateFileMapping(
                (HANDLE)0xffffffff,
                NULL,
                PAGE_READWRITE,
                0,
                DATA_SIZE,
                MAP_FILENAME);

    BOOL bExists = (GetLastError() == ERROR_ALREADY_EXISTS);
    lpMem = ::MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, DATA_SIZE);
    if (!bExists)
        ZeroMemory(lpMem, DATA_SIZE);
}

2.マップドファイルをクロスします。例:

void CloseMapFile_Test()
{
    UnmapViewOfFile(lpMem);
    CloseHandle(hMapFile);
}
3.メモリにアクセスします。普通のメモリのようにアクセスできますが、排他制御が必要な場合は殆どです。ミューテックスとWaitForSingleObject()APIを使って、排他制御を行うか、MFCのCMutexクラスを使っても便利です。例:
HANDLE hMutex = NULL;

void GetData()
{
    WaitForSingleObject(hMutex, INFINITE);
    //ToDo:共有データにサクセスする
    memcpy(buff, lpMem, DATA_SIZE); 
    ReleaseMutex(hMutex);
}

void SetData()
{
    WaitForSingleObject(hMutex, INFINITE);
    //ToDo:共有データにサクセスする
    memcpy(buff, lpMem, DATA_SIZE); 
    ReleaseMutex(hMutex);
}