ファイル マッピング オブジェクトの作成
ファイルのマッピングの最初の手順では、 CreateFile 関数を呼び出してファイルを開きます。 他のプロセスがマップされているファイルの部分に書き込めないようにするには、排他アクセスでファイルを開く必要があります。 さらに、プロセスでファイル マッピング オブジェクトが不要になるまで、ファイル ハンドルは開いたままにする必要があります。 排他的アクセスを取得する簡単な方法は、CreateFile の fdwShareMode パラメーターに 0 を指定することです。 CreateFile によって返されるハンドルは、CreateFileMapping 関数によってファイル マッピング オブジェクトを作成するために使用されます。
CreateFileMapping 関数は、ファイル マッピング オブジェクトへのハンドルを返します。 このハンドルは、共有メモリにアクセスできるように ファイル ビューを作成 するときに使用されます。 CreateFileMapping を呼び出すときは、オブジェクト名、ファイルからマップされるバイト数、およびマップされたメモリの読み取り/書き込みアクセス許可を指定します。 CreateFileMapping を呼び出す最初のプロセスでは、ファイル マッピング オブジェクトが作成されます。 既存のオブジェクトに対して CreateFileMapping を呼び出すプロセスは、既存のオブジェクトへのハンドルを受け取ります。 CreateFileMapping の呼び出しが成功したかどうかを確認するには、GetLastError 関数を呼び出すことによって、ファイル マッピング オブジェクトを作成または開きました。 GetLastError は 、作成プロセスに NO_ERROR を返し、後続のプロセスに ERROR_ALREADY_EXISTS します。
CreateFile 関数がファイルを開いたときに指定されたアクセス フラグと競合する場合、CreateFileMapping 関数は失敗します。 たとえば、ファイルの読み取りと書き込みを行う場合:
- CreateFile の fdwAccess パラメーターにGENERIC_READとGENERIC_WRITEの値を指定します。
- CreateFileMapping の fdwProtect パラメーターにPAGE_READWRITE値を指定します。
ファイル マッピング オブジェクトを作成しても、物理メモリはコミットされず、予約されるだけです。
ファイル マッピング のサイズ
ファイル マッピング オブジェクトのサイズは、マップされるファイルのサイズとは無関係です。 ただし、ファイル マッピング オブジェクトがファイルよりも大きい場合、 CreateFileMapping が返される前に、システムによってファイルが展開されます。 ファイル マッピング オブジェクトがファイルよりも小さい場合、システムはファイルから指定されたバイト数のみをマップします。
CreateFileMapping の dwMaximumSizeHigh パラメーターと dwMaximumSizeLow パラメーターを使用すると、ファイルからマップするバイト数を指定できます。
ファイルのサイズを変更しない場合 (たとえば、読み取り専用ファイルをマッピングする場合)、 CreateFileMapping を呼び出し、 dwMaximumSizeHigh と dwMaximumSizeLow の両方に 0 を指定します。 これにより、ファイルとまったく同じサイズのファイル マッピング オブジェクトが作成されます。 それ以外の場合は、ファイル マッピング オブジェクトのサイズが静的であるため、完成したファイルのサイズを計算または見積もる必要があります。一度作成すると、そのサイズを増減することはできません。 この方法で長さが 0 のファイルをマップしようとすると、エラー コード ERROR_FILE_INVALIDで失敗します。 プログラムは、長さが 0 のファイルをテストし、そのようなファイルを拒否する必要があります。
名前付きファイルによってサポートされるファイル マッピング オブジェクトのサイズは、ディスク領域によって制限されます。 ファイル ビューのサイズは、予約されていない仮想メモリの使用可能な最大連続ブロックに制限されます。 これは、プロセスによって既に予約されている仮想メモリを差し引いた最大 2 GB です。
選択したファイル マッピング オブジェクトのサイズは、メモリ マッピングを使用してファイルを "表示" できる距離を制御します。 サイズが 500 Kb のファイル マッピング オブジェクトを作成する場合、ファイルのサイズに関係なく、ファイルの最初の 500 Kb にのみアクセスできます。 より大きなファイル マッピング オブジェクトを作成するためのシステム リソースのコストはかからないため、ファイル全体を表示する予定がない場合でも、ファイルのサイズであるファイル マッピング オブジェクトを作成します (CreateFileMapping の dwMaximumSizeHigh パラメーターと dwMaximumSizeLow パラメーターを 0 に設定します)。 システム リソースのコストは、ビューを作成してアクセスする場合に発生します。
ファイルの先頭から始まらないファイルの一部を表示できます。 詳細については、「 ファイル内でのビューの作成」を参照してください。
関連トピック