HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY_ATTRIBUTES SecurityAttr, DWORD Protect, DWORD MaxSizeHigh, DWORD MaxSizeLow, LPCTSTR MapName);
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が返される。
#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);
}