共有メモリは、CreateFileMapping()関数で共有メモリをオープンして、MapViewOfFile()関数でメモリにマッピングして利用します。
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <windows.h> /* 共有メモリ(書き込み側) */ int _tmain ( int argc , _TCHAR* argv[] ) { /* std::wcoutのロケールを設定 これを設定するだけで、std::wcoutで日本語が表示される ようになります。 */ std::wcout.imbue( std::locale( "", std::locale::ctype ) ); // 共有メモリサイズ DWORD dwSharedMemorySize = 1024; /* 共有メモリのオープン 存在しなかった場合は、新規作成されます。存在していた場合は、 既存のハンドルが返ります。 */ HANDLE hSharedMemory = ::CreateFileMapping( INVALID_HANDLE_VALUE // ファイルハンドル( 共有メモリの場合は、0xffffffff(INVALID_HANDLE_VALUE)を指定 ) , NULL // SECURITY_ATTRIBUTES構造体 , PAGE_READWRITE // 保護属性( PAGE_READONLY / PAGE_READWRITE / PAGE_WRITECOPY, SEC_COMMIT / SEC_IMAGE / SEC_NOCACHE / SEC_RESERVE ) , 0 // ファイルマッピング最大サイズ(HIGH) , dwSharedMemorySize // ファイルマッピング最大サイズ(LOW) , L"TEST_SHARED_MEMORY" // 共有メモリ名称 ); if ( NULL != hSharedMemory ) { std::wcout << L"共有メモリオープン成功" << std::endl; // 共有メモリのマッピング CHAR* cpSharedMemory = (CHAR*)::MapViewOfFile( hSharedMemory // ファイルマッピングオブジェクトのハンドル , FILE_MAP_WRITE // アクセスモード( FILE_MAP_WRITE/ FILE_MAP_READ / FILE_MAP_ALL_ACCESS / FILE_MAP_COPY ) , 0 // マッピング開始オフセット(LOW) , 0 // マッピング開始オフセット(HIGH) , dwSharedMemorySize // マップ対象のファイルのバイト数 ); if ( NULL != cpSharedMemory ) { std::wcout << L"共有メモリマッピング成功( 0x" << std::hex << (DWORD)cpSharedMemory << std::dec << L" )" << std::endl; /* 共有メモリへの書き込み 先ほど、1024バイトをマッピングしているので、 普通のメモリと同様に読み書きできます。 */ ::wcscpy_s( (TCHAR*)cpSharedMemory, dwSharedMemorySize / sizeof(TCHAR), L"共有メモリ読みだせるかな?" ); // 共有マッピングの解除 ::UnmapViewOfFile( cpSharedMemory ); } else { std::wcout << L"共有メモリマッピング失敗" << std::endl; } } else { std::wcout << L"共有メモリオープン失敗" << std::endl; } // 共有メモリ読み出し待ち ::MessageBox( NULL, L"共有メモリテスト中", L"お知らせ", MB_OK ); // ファイルマッピングオブジェクトハンドルの解放 if ( NULL != hSharedMemory ) { ::CloseHandle( hSharedMemory ); } // 正常終了 return( 0 ); }
#include <stdio.h> #include <tchar.h> #include <iostream> #include <string> #include <windows.h> /* 共有メモリ(読み出し側) */ int _tmain ( int argc , _TCHAR* argv[] ) { /* std::wcoutのロケールを設定 これを設定するだけで、std::wcoutで日本語が表示される ようになります。 */ std::wcout.imbue( std::locale( "", std::locale::ctype ) ); // 共有メモリサイズ DWORD dwSharedMemorySize = 1024; /* 共有メモリのオープン 存在しなかった場合は、新規作成されます。存在していた場合は、 既存のハンドルが返ります。 */ HANDLE hSharedMemory = ::CreateFileMapping( INVALID_HANDLE_VALUE // ファイルハンドル( 共有メモリの場合は、0xffffffff(INVALID_HANDLE_VALUE)を指定 ) , NULL // SECURITY_ATTRIBUTES構造体 , PAGE_READWRITE // 保護属性( PAGE_READONLY / PAGE_READWRITE / PAGE_WRITECOPY, SEC_COMMIT / SEC_IMAGE / SEC_NOCACHE / SEC_RESERVE ) , 0 // ファイルマッピング最大サイズ(HIGH) , dwSharedMemorySize // ファイルマッピング最大サイズ(LOW) , L"TEST_SHARED_MEMORY" // 共有メモリ名称 ); if ( NULL != hSharedMemory ) { // 共有メモリのマッピング CHAR* cpSharedMemory = (CHAR*)::MapViewOfFile( hSharedMemory // ファイルマッピングオブジェクトのハンドル , FILE_MAP_WRITE // アクセスモード( FILE_MAP_WRITE/ FILE_MAP_READ / FILE_MAP_ALL_ACCESS / FILE_MAP_COPY ) , 0 // マッピング開始オフセット(LOW) , 0 // マッピング開始オフセット(HIGH) , dwSharedMemorySize // マップ対象のファイルのバイト数 ); if ( NULL != cpSharedMemory ) { std::wcout << L"共有メモリマッピング成功( 0x" << std::hex << (DWORD)cpSharedMemory << std::dec << L" )" << std::endl; /* 共有メモリへの書き込み 先ほど、1024バイトをマッピングしているので、 普通のメモリと同様に読み書きできます。 */ // 共有メモリの表示 std::wcout << (TCHAR*)cpSharedMemory << std::endl; // 共有マッピングの解除 ::UnmapViewOfFile( cpSharedMemory ); } } // ファイルマッピングオブジェクトハンドルの解放 if ( NULL != hSharedMemory ) { ::CloseHandle( hSharedMemory ); } // 正常終了 return( 0 ); }
共有メモリオープン成功
共有メモリマッピング成功( 0x450000 )