プラットフォーム SDK
MapViewOfFile
呼び出し側プロセスのアドレス空間に、ファイルのビューをマップします。
推奨されるベースアドレスを指定するには、MapViewOfFileEx 関数を使ってください。
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // ファイルマッピングオブジェクトのハンドル
DWORD dwDesiredAccess, // アクセスモード
DWORD dwFileOffsetHigh, // オフセットの上位 DWORD
DWORD dwFileOffsetLow, // オフセットの下位 DWORD
SIZE_T dwNumberOfBytesToMap // マップ対象のバイト数
);
パラメータ
- hFileMappingObject
- 開いているファイルマッピングオブジェクトのハンドルを指定します。CreateFileMapping と OpenFileMapping の各関数がこのハンドルを返します。
- dwDesiredAccess
- ファイルビューへのアクセスタイプ、つまりそのファイルへマップされているページの保護タイプを指定します。次の値のいずれかを指定します。
| 値 | 意味 |
| FILE_MAP_WRITE | 読み書きアクセスです。hFileMappingObject パラメータで指定するオブジェクトは、PAGE_READWRITE の保護を指定して作成したものでなければなりません。ファイルの読み書き可能ビューがマップされます。 |
| FILE_MAP_READ | 読み取り専用アクセスです。hFileMappingObject パラメータで指定するオブジェクトは、PAGE_READWRITE または PAGE_READONLY の保護を指定して作成したものでなければなりません。ファイルの読み取り専用ビューがマップされます。 |
| FILE_MAP_ALL_ACCESS | FILE_MAP_WRITE と同じです。 |
| FILE_MAP_COPY | コピーへの読み書きアクセスです。PAGE_WRITECOPY アクセスを指定してマップを作成し、FILE_MAP_COPY の保護を指定してビューを作成すると、ファイルに対する 1 つのビューを受け取ります。そのビューへの書き込みを行うと、ページは自動的にスワップ可能になり、その後に加えた変更は元のディスクファイルに書き込まれません。
Windows 95:CreateFileMapping 関数で PAGE_WRITECOPY を指定しなければなりません。それ以外の場合、エラーが発生します。
または OpenFileMapping を使って複数のプロセスで 1 つのマッピングを共有している場合、1 つのプロセスがビューへの書き込みを行うと、その変更は他のプロセスへも伝達されます。元のファイルは変化しません。
Windows NT/2000:hFileMappingObject パラメータで指定するオブジェクトの作成方法に制約はありません。ビューのタイプがどのようなものであっても、コピーへの書き込みだけが有効です。
または OpenFileMapping を使って複数のプロセスで 1 つのマッピングを共有している場合、1 つのプロセスがビューへの書き込みを行っても、その変更は他のプロセスへは伝達されません。元のファイルは変化しません。
|
- dwFileOffsetHigh
- マッピングを開始するファイルのオフセットの上位(high-order)DWORD を指定します。
- dwFileOffsetLow
- マッピングを開始するファイルのオフセットの下位(low-order)DWORD を指定します。上位と下位の組み合わせによって形成される組み合わせで、システムのメモリ割り当ての粒度(最小単位)に一致するオフセットを指定しなければなりません。それ以外の場合、関数は失敗します。つまり、このオフセットは、メモリ割り当ての粒度の倍数でなければなりません。 関数を呼び出し、 構造体の dwAllocationGranularity メンバに書き込まれた値を使って、システムのメモリ割り当ての粒度を取得してください。
- dwNumberOfBytesToMap
- マップ対象のファイルのバイト数を指定します。0 を指定すると、ファイルマッピングオブジェクト全体がマップされます。
戻り値
関数が成功すると、ファイルがマップされたビューの開始アドレスが返ります。
関数が失敗すると、NULL が返ります。拡張エラー情報を取得するには、 関数を使います。
解説
ファイルをマッピングすると、ファイルの指定された部分が、呼び出し側プロセスのアドレス空間内で認識できます。
1 つのファイルの複数のビュー(言い換えると、ファイルマッピングオブジェクトとそれに対応するマップトファイル)には、一貫性があります。つまり、特定の時点では、どのビューも同じデータを保持しています。これは、共通のファイルマッピングオブジェクトから複数のファイルビューを作成した場合に成立することです。1 つのプロセスは、 関数を使って、1 つのファイルマッピングオブジェクトのハンドルを他のプロセスへコピーできます。また、他のプロセスは OpenFileMapping 関数を使って、名前を指定して 1 つのファイルマッピングオブジェクトを開くことができます。
ファイルへマップされたビューと、 関数や 関数によってアクセスされるファイルの間には、一貫性の保証はありません。
•Windows 95:MapViewOfFile がスワップファイルを拡張する必要が生じることがあります。スワップファイルが拡張不可能な場合、この関数は失敗します。
•Windows NT/2000:ファイルマッピングオブジェクトをページングファイルに関連付けた場合(hFile が INVALID_HANDLE_VALUE)、ページングファイルはマッピング全体を保持できる十分な大きさでなければなりません。それだけの大きさがない場合、MapViewOfFile は失敗します。
注意 アクセス違反を防止するために、構造化例外処理を使って、コードがメモリマップトビューへの書き込みや読み取りを行うことを禁止してください。詳細については、「」を参照してください。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
参照
CreateFileMapping, , , MapViewOfFileEx, OpenFileMapping, UnmapViewOfFile,