CreateFileMapping ファイルマッピングオブジェクトの作成

Cの宣言:

HANDLE CreateFileMapping(
	HANDLE hFile,
	LPSECURITY_ATTRIBUTES SecurityAttr,
	DWORD Protect,
	DWORD MaxSizeHigh,
	DWORD MaxSizeLow,
	LPCTSTR MapName);

説明:

hFileで指定されたファイルに対するファイルマッピングオブジェクトを作成する。

hFileに0xffffffffを指定した場合、ページングファイル上のメモリ領域に対するファイルマッピングオブジェクトが作成される。これは主に共有メモリを使用したい場合に用いられる。

ファイルマッピングオブジェクトの最大サイズは、64bit値で指定する。上位32bitをMaxSizeHighに、下位32bitをMaxSizeLowに設定する。ただし、hFileが0xffffffffでない場合、最大サイズを0としてCreateFileMappingを実行すると、最大サイズはhFileで指定したファイルのサイズであるとみなされる。ファイルのサイズよりも大きい値を最大サイズとして指定した場合、ファイルは拡張される。

複数のマシンからアクセスされるファイルに対するファイルマッピングオブジェクトを作成した場合、動作は保証されない。

マップされているファイルに対してReadFileやWriteFileを行った場合、同期が取れているとは限らない。

95において、あるファイルに対するファイルマッピングオブジェクトを作成した場合、そのファイルマッピングオブジェクトをクローズするまでReadFileやWriteFileでファイルにアクセスしてはならない。

既にMapNameで指定したファイルマッピングオブジェクトが存在する場合、CreateFileMappingは既存のファイルマッピングオブジェクトをオープンする。その場合、エラー値はERROR_ALREADY_EXISTSを取る。

引数の意味は以下の通り。
hFile ファイルマッピングオブジェクトの作成元のファイル。hFileに0xffffffffを指定した場合、ページングファイル上のメモリ領域に対するファイルマッピングオブジェクトが作成される。
SecurityAttr 作成するファイルマッピングオブジェクトに付与するセキュリティ属性。NULLを指定可能。
Protect 作成するファイルマッピングオブジェクトのアクセスに関する設定を行うためのフラグ。後述の表を参照。
MaxSizeHigh 作成するファイルマッピングオブジェクトの最大サイズの上位32bit。
MaxSizeLow 作成するファイルマッピングオブジェクトの最大サイズの下位32bit。
MapName 作成するファイルマッピングオブジェクトの名前。NULLを指定した場合、名前無しファイルマッピングオブジェクトが作成される。

Protectには、まず次のいずれかの値が指定可能である。
PAGE_READONLY (略)
PAGE_READWRITE (略)
PAGE_WRITECOPY (略)

次に、以下の任意の数のフラグを、上記フラグとの論理和を取ることによって指定可能である。
SEC_FILE (略)
SEC_IMAGE (略)
SEC_RESERVE (略)
SEC_COMMIT (略)
SEC_NOCACHE (略)

戻り値は、作成またはオープンしたファイルマッピングオブジェクトのハンドルである。関数の実行に失敗した場合、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 更新)

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