MapViewOfFile ファイルマッピングオブジェクトをメモリ上にマップする

Cの宣言:

LPVOID MapViewOfFile(
	HANDLE hMap,
	DWORD AccessMode,
	DWORD OffsetHigh,
	DWORD OffsetLow,
	DWORD MapSize);

説明:

hMapで指定したファイルマッピングオブジェクトをメモリ上にマップし、マップしたメモリ領域へのポインタを返す。

ファイル上のどの位置からマップするかを指定するには、OffsetHigh及びOffsetLow引数を使用する。それぞれファイル上の位置を表す64bit値の上位32bit、下位32bitを指定する。位置は、メモリページのサイズの倍数でなければならない。

引数の意味は以下の通り。
hMap マップするファイルマッピングオブジェクトのハンドル。
AccessMode ビューに対するアクセスモード。後述の表を参照。
OffsetHigh ファイル上のどの位置からマップするかを指定する64it値の上位32bit。
OffsetLow ファイル上のどの位置からマップするかを指定する64it値の下位32bit。
MapSize マップするバイト数。

AccessModeに指定可能な値は以下のいずれかのフラグである。
FILE_MAP_WRITE (略)
FILE_MAP_READ (略)
FILE_MAP_ALL_ACCESS (略)
FILE_MAP_COPY (略)

ただし、95ではFILE_MAP_COPYのみ指定可能。

戻り値は、マップしたメモリ領域のアドレスである。関数の実行に失敗した場合、NULLが返される。

Cのサンプル:

下記サンプルは、起動するごとに、現在起動されているサンプルの数を表示する。起動数の管理には、ファイルマッピングオブジェクトによる共有メモリを利用している。下記サンプルが起動されるたびに、共有メモリ上の、起動数を表すカウンタをインクリメントし、表示する。また、サンプルの終了時に、起動数を表すカウンタをデクリメントする。これら共有メモリのアクセスの際には、ミューテックスを利用することにより、排他制御を行っている。
#define MAPPED_FILE_NAME "Test File Mapping Object"
#define MUTEX_NAME "Test Mutex Object"

typedef struct {
	LONG cnt;
} SHARED_DATA;

int main()
{
	HANDLE hMap; /* ファイルマッピングオブジェクトのハンドル */
	HANDLE hMutex = NULL; /* 共有データへの排他アクセス用ミューテックスオブジェクトのハンドル */
	SHARED_DATA	CurrentData, *pData; /* 共有するデータ */
	BOOL bAlreadyExists; /* 既にファイルマッピングオブジェクトが作成されているかどうかを表す真偽値 */
	char msg[1000];

	/* 排他制御用ミューテックスオブジェクト作成 */
	hMutex = CreateMutex(NULL, FALSE, MUTEX_NAME);

	/* ファイルマッピングオブジェクトの作成 */
	hMap = CreateFileMapping(
		(HANDLE)0xffffffff,
		NULL,
		PAGE_READWRITE | SEC_COMMIT,
		0, sizeof(SHARED_DATA), 
		MAPPED_FILE_NAME);

	/* 既に作成されていた? */
	bAlreadyExists = (GetLastError() == ERROR_ALREADY_EXISTS);

	/* ビューの作成 */
	pData = (SHARED_DATA *)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(SHARED_DATA));
	
	/* 新規に作成された場合、共有データの初期化を行う */
	if(!bAlreadyExists) {
		pData->cnt = 0;
	}

	/* 起動数のインクリメント */
	WaitForSingleObject(hMutex, INFINITE);
	pData->cnt++;
	CurrentData = *pData;
	ReleaseMutex(hMutex);

	/* 結果の表示 */
	wsprintf(msg, "起動数: %d", CurrentData.cnt);
	MessageBox(NULL, msg, "Mapped File Test", MB_OK);

	/* 起動数のデクリメント */
	WaitForSingleObject(hMutex, INFINITE);
	pData->cnt--;
	ReleaseMutex(hMutex);

	/* 後処理 */
	CloseHandle(hMutex);
	UnmapViewOfFile(pData);
	CloseHandle(hMap);

	return(0);
}
(original text:1999/02/18 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。