共有メモリは、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 )