UnmapViewOfFile ファイルマッピングオブジェクトのビューをアンマップする

Cの宣言:

BOOL UnmapViewOfFile(LPCVOID pView);

説明:

pViewが指すメモリ領域上にマップされているファイルマッピングオブジェクトのビューをアンマップする。

アプリケーションが、ファイルマッピングオブジェクトのビューに使用したファイルハンドルを既に閉じている場合にでも、システムは最後のビューがアンマップされるまでの間、ファイルハンドルを保持しつづける。その際、95では元のファイルオープン時に指定した共有モードでファイルハンドルを保ち、NTでは共有に制限を付与しない形でファイルハンドルを保つ。

引数の意味は以下の通り。
pView ファイルマッピングオブジェクトのビューを指すポインタ。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

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 更新)

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