ファイルマッピングにより共有メモリ作成(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(lpMem, buff, DATA_SIZE); ReleaseMutex(hMutex); } |