<Return[MN]><Top>

MapViewOfFileEx

Declare Function Api_MapViewOfFile& Lib "kernel32" Alias "MapViewOfFile" (ByVal hFileMappingObject&, ByVal dwDesiredAccess&, ByVal dwFileOffsetHigh&, ByVal dwFileOffsetLow&, ByVal dwNumberOfBytesToMap&)

Declare Function MapViewOfFile Lib "kernel32" Alias "MapViewOfFile" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long

ファイルのビューを呼び出し側プロセスのアドレス空間にマップする。この拡張関数によって、マップするビューの推奨メモリアドレスを呼び出し側プロセスで指定できるようになる。

パラメータ
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 を使ってビューを作

成すると、ファイルのビューを取得できる。そのビューに書き込むと、ページは自動的にスワップ可能になり、書き

込み内容は元のデータファイルには送信されない。
Windows 95: PAGE_WRITECOPY を CreateFileMapping 関数に渡さなければならない。これを行なわない場

合は、エラーが返る。
DuplicateHandle 関数、または OpenFileMapping 関数を使って複数のプロセス間でマッピングを共有している状

態で、あるプロセスがビューへの書き込みを行なうと、書き込み内容は別のプロセスへ伝播される。元のファイルは変更されない。
Windows NT/2000: hFileMappingObject パラメータの生成方法に関する制約はない。書き込みアクセスでのコ

ピーは、どのタイプのビューに対しても適用できる。
DuplicateHandle 関数、または OpenFileMapping 関数を使って複数のプロセス間でマッピングを共有している

状態で、あるプロセスがビューへの書き込みを行なっても、書き込み内容は別のプロセスへ伝播されない。

元のファイルは変更されない。

dwFileOffsetHigh
    マッピングを開始する下位 32 ビットのファイルオフセットを指定する。
dwFileOffsetLow
    マッピングを開始する上位 32 ビットのファイルオフセットを指定する。

    下位オフセットと上位オフセットの組み合わせは、システムのメモリ割り当ての単位と一致するファイル内のオフセットを指定するものでなくて

    はならない。この指定を誤ると、関数は失敗する。つまり、オフセットは割り当ての単位の倍数でなければならない。システムのメモリ割り

    当ての単位を取得するには、SYSTEM_INFO 構造体のメンバを記述する GetSystemInfo 関数を使う。
dwNumberOfBytesToMap
    マップするファイルのバイト数を指定する。0 を指定すると、ファイル全体がマップされる。
lpBaseAddress
    呼び出し側プロセスのアドレス空間でマッピングを開始するメモリアドレスへのポインタを指定する。

    この値は、システムのメモリ割り当ての単位の倍数でなければならない。それ以外の値を指定すると、関数は失敗する。

    システムのメモリ割り当ての単位を取得するには、SYSTEM_INFO 構造体のメンバを記述する GetSystemInfo 関数を使う。

    指定されたアドレスに十分なアドレス空間がないと、関数は失敗する。
    NULL を指定すると、オペレーティングシステムがマッピングアドレスを選択する。

    この場合、MapViewOfFileEX 関数は MapViewOfFile 関数と同じ機能を果たす。

戻り値
    関数が成功すると、ビューのマッピングを開始したアドレスが返る。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。

 

解説
    ファイルマッピングを実行すると、ファイルの指定された部分が呼び出し側プロセスのアドレス空間で見ることができる。
    推奨マッピングアドレスを指定すると、そのアドレスからファイルがマッピングされる( マップされたファイルは約 64K の境界で切り捨てられ

    る)。指定したアドレスに十分なアドレス空間がないと、関数は失敗する。
    推奨アドレスは通常、複数のプロセスで、ファイルマッピングを同じアドレスで実行するように指定するのに使われる。この場合、指定された

    アドレス空間のリージョンがすべてのプロセスで使用可能である必要がある。マッピングに使うリージョンでは、VirtualAlloc 関数によるメモリ

    の予約を含め、ほかのメモリ割り当てを実行しないようにする。
    Windows 95:lpBaseAddress パラメータに基準オフセットを指定すると、すべての 32 ビットプロセスでマップされるファイルに対して同じメモリ

    リージョンが使用できる場合にだけ関数が成功する。
    Windows NT/2000:lpBaseAddress パラメータに基準オフセットを指定すると、そのメモリリージョンがほかの呼び出し側プロセスで使われて

    いない場合に関数が成功する。システムでは、ほかの 32 ビットプロセスでマップされるファイルに対して同じメモリリージョンを使用できるかど

    うかは保証されない。
    特定の時間に同じデータが表示されるファイル( または、ファイルマッピングオブジェクトとマップされたファイル)の複数のビューを、「コヒーレン

    ト」という。コヒーレントは、ファイルビューが同じファイルマッピングオブジェクトから派生した場合に発生する。 関数を使うと、プロセスからフ

    ァイルマッピングオブジェクトのハンドルを別のプロセスにコピーすることができる。また、OpenFileMapping 関数を使うと、別のプロセスから

    名前を指定してファイルマッピングオブジェクトを開くことができる。
    マップされたファイルビューは、 関数、または 関数でアクセスされるファイルの場合、コヒーレンシでないことがある。
    注意 アクセス違反を防ぐために、構造化例外処理を使い、メモリにマップされたビューの読み書きコードを保護する。