BOOL UnmapViewOfFile(LPCVOID pView);
アプリケーションが、ファイルマッピングオブジェクトのビューに使用したファイルハンドルを既に閉じている場合にでも、システムは最後のビューがアンマップされるまでの間、ファイルハンドルを保持しつづける。その際、95では元のファイルオープン時に指定した共有モードでファイルハンドルを保ち、NTでは共有に制限を付与しない形でファイルハンドルを保つ。
引数の意味は以下の通り。
| pView | ファイルマッピングオブジェクトのビューを指すポインタ。 |
戻り値は、関数の実行に成功したか否かを表す真偽値である。
#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);
}