わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

共有メモリ

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






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。