<Return[C]><Top>

CreateFileMapping

Declare Function Api_CreateFileMapping& Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile&, ByVal lpFileMappigAttributes&, ByVal flProtect&, ByVal dwMaximumSizeHigh&, ByVal dwMaximumSizeLow&, ByVal lpName$)

Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long

指定されたファイルに対する、名前付きまたは名前なしのファイルマッピングオブジェクトを作成または開く。

パラメータ
hFile
    ファイルマッピングオブジェクトの作成元ファイルのハンドルを指定する。

    パラメータで指定する保護フラグと互換性のあるアクセスモードで、このファイルを開いておかなければならない。

    また、排他アクセスモードで開いておくことを推奨する。
    hFile パラメータで INVALID_HANDLE_VALUE を指定した場合、呼び出し側プロセスは dwMaximumSizeHigh と

    dwMaximumSizeLow の各パラメータを使ってマッピングオブジェクトのサイズも指定しなければならない。

    この場合、CreateFileMapping は指定されたサイズのファイルマッピングオブジェクトを作成するが、ファイルシステム内の名前付きファイル

   ではなく、オペレーティングシステムのページングファイルに関連付ける。

    複製、継承、名前の指定のいずれかより、ファイルマッピングオブジェクトを共有することもできる。
lpAttributes
    取得したハンドルを子プロセスへ継承することを認める許可するかどうかを決定する、1 個の SECURITY_ATTRIBUTES 構造体へのポイン

    タを指定する。NULL を指定すると、マッピングオブジェクトのハンドルを継承できない。
    Windows NT/2000:SECURITY_ATTRIBUTES 構造体の lpSecurityDescriptor メンバは、セキュリティ記述子を指定する。NULL を

    指定すると、ファイルマッピングオブジェクトは既定のセキュリティ記述子を受け取る。
flProtect
    ファイルをマッピングする際に、ファイルビューに割り当てられる保護属性を指定する。次の値のいずれかを指定する。

    値                               

説明                                                                                                                      

    PAGE_READONLY

コミット済みのページ領域に、読み取り専用アクセスを割り当てる。

 

このコミット済み領域への書き込みまたは実行を試みると、アクセス違反が発生する。

 

hFile パラメータで指定するファイルは、GENERIC_READ アクセスを指定して作成したものでなければならない。

    PAGE_READWRITE

コミット済みのページ領域に、読み書きアクセスを割り当てる。hFile パラメータで指定するファイルは、

 

GENERIC_READ および GENERIC_WRITE アクセスを指定して作成したものでなければならない。

    PAGE_WRITECOPY

コミット済みのページ領域に、読み書きアクセスを割り当てる。ただし、元のファイルは変更されず、元のファイル

 

の複製が使われる。hFile パラメータで指定するファイルは、GENERIC_READ および GENERIC_WRITE

 

アクセスを指定して作成したものでなければならない。

    ビット単位の OR 演算子を使って、ページ保護に関係する上記の値に、次に示すセクション属性値の 1 つまたは複数を組み合わせることが

    できる。

    値                      

説明                                                                                                                             

    SEC_COMMIT

1 つのセクションのすべてのページに、メモリ内の物理記憶またはディスク上のページングファイルを割り当てる。

 

これは既定の設定。

    SEC_IMAGE

ファイルマッピングの 1 つのセクションに対して指定したファイルが、実行可能なイメージファイルであることを示する。

 

この値を指定した場合は、イメージファイルからマッピング情報とファイル保護を取得するので、SEC_IMAGE と共に他の

 

属性を指定しても有効にならない。

    SEC_NOCACHE

1 つのセクションのすべてのページをキャッシュ不可能として設定する。

 

この属性は、プロセッサにまだフェッチされていないメモリに対してさまざまなロックメカニズムを必要とするアーキテクチャを

 

想定している。

    SEC_RESERVE

物理記憶を割り当てずに、1 つのセクションのすべてのページを予約する。

 

予約済みのページは、解放しない限り、1 つのの割り当て操作で使うことはできない。

dwMaximumSizeHigh
    ファイルマッピングオブジェクトの最大サイズの上位(high-order)DWORD を指定する。
dwMaximumSizeLow
    ファイルマッピングオブジェクトの最大サイズの下位(low-order)DWORD を指定する。dwMaximumSizeLow と dwMaximumSizeHigh

    の両方のパラメータで 0 を指定すると、hFile パラメータで指定したファイルの現在のサイズが、ファイルマッピングオブジェクトの最大サイズに

    なる。
    この方法で、サイズが 0 のファイルへのマッピングを行おうとすると、関数は失敗し、ERROR_FILE_INVALID のエラーコードが返る。

    サイズが 0 のファイルに関してはアプリケーションはこのテストを行って、そのようなファイルを排除すべきである。
lpName
    ファイルマッピングオブジェクトの名前を保持している、NULL で終わる文字列へのポインタを指定する。
    この名前が、既存の名前付きマッピングオブジェクトの名前と一致した場合は、この関数は、flProtect が表す保護を指定して、そのマッピ

    ングオブジェクトへのアクセスを要求する。
    NULL を指定すると、名前を持たないマッピングオブジェクトが作成される。
    lpName が、既存のイベント、セマフォ、ミューテックス(mutually exclusive;相互排他)、待機可能タイマ、ジョブいずれかのオブジェ

    クトの名前と一致する場合、この関数は失敗し、GetLastError 関数は ERROR_INVALID_HANDLE を返する。

    これらのオブジェクトが同じ名前空間を共有することが原因。
    Terminal Services:グローバル名前空間またはセッション名前空間でオブジェクトを明示的に作成するために、「Global\」または

    「Local\」の接頭辞を付けることができる。名前の残りの部分は、円記号(\)を除き、任意の文字を記述できる。
    Windows 2000:Terminal Services が動作していない Windows 2000 システムでは、「Global\」と「Local\」の各接頭辞は無視され

    る。名前の残りの部分は、円記号(\)を除き、任意の文字を記述できる。
    Windows NT 4.0 以前と Windows 95/98:名前は、円記号(\)を除き、任意の文字を記述できる。

戻り値
    ファイルマッピングオブジェクトの新規作成に成功した場合は、新しいファイルマッピングオブジェクトのハンドルが返る。

    指定したファイルマッピングオブジェクトが既に存在していた場合は、既存のファイルマッピングオブジェクトのハンドルが返る。

    オブジェクトのサイズは、指定したサイズではなく、そのオブジェクトの現在のサイズになる。また、GetLastError 関数の戻り値は

    ERROR_ALREADY_EXISTS になる。
    関数が失敗すると、NULL が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。