次の方法で共有


MapViewOfFile 関数 (memoryapi.h)

ファイル マッピングのビューを呼び出し元プロセスのアドレス空間にマップします。

ビューの推奨ベース アドレスを指定するには、MapViewOfFileEx 関数を使用します。 ただし、この方法はお勧めしません。

構文

LPVOID MapViewOfFile(
  [in] HANDLE hFileMappingObject,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwFileOffsetHigh,
  [in] DWORD  dwFileOffsetLow,
  [in] SIZE_T dwNumberOfBytesToMap
);

パラメーター

[in] hFileMappingObject

ファイル マッピング オブジェクトへのハンドル。 CreateFileMapping 関数と OpenFileMapping 関数 は、このハンドルを返します。

[in] dwDesiredAccess

ページのページ保護を決定するファイル マッピング オブジェクトへのアクセスの種類。 このパラメーターには、次のいずれかの値、または必要に応じて複数の値のビットごとの OR の組み合わせを指定できます。

価値 意味
FILE_MAP_ALL_ACCESS
ファイルの読み取り/書き込みビューがマップされます。 ファイル マッピング オブジェクトは、PAGE_READWRITE または PAGE_EXECUTE_READWRITE 保護を使用して作成されている必要があります。

MapViewOfFile 関数と共に使用する場合、FILE_MAP_ALL_ACCESSFILE_MAP_WRITEと同じです。

FILE_MAP_READ
ファイルの読み取り専用ビューがマップされます。 ファイル ビューに書き込もうとすると、アクセス違反が発生します。

ファイル マッピング オブジェクトは、PAGE_READONLYPAGE_READWRITEPAGE_EXECUTE_READ、または PAGE_EXECUTE_READWRITE 保護を使用して作成されている必要があります。

FILE_MAP_WRITE
ファイルの読み取り/書き込みビューがマップされます。 ファイル マッピング オブジェクトは、PAGE_READWRITE または PAGE_EXECUTE_READWRITE 保護を使用して作成されている必要があります。

MapViewOfFile、(FILE_MAP_WRITE | FILE_MAP_READ) と FILE_MAP_ALL_ACCESS で使用する場合は、FILE_MAP_WRITEと同じです。

 

ビットごとの OR を使用すると、上記の値とこれらの値を組み合わせることができます。

価値 意味
FILE_MAP_COPY
ファイルの書き込み時のコピー ビューがマップされます。 ファイル マッピング オブジェクトは、PAGE_READONLYPAGE_EXECUTE_READPAGE_WRITECOPYPAGE_EXECUTE_WRITECOPYPAGE_READWRITE、または PAGE_EXECUTE_READWRITE 保護を使用して作成されている必要があります。

プロセスが書き込み時のコピー ページに書き込むと、システムは元のページを、プロセスに対してプライベートな新しいページにコピーします。 新しいページはページング ファイルによってサポートされます。 新しいページの保護は、書き込み時のコピーから読み取り/書き込みに変わります。

書き込み時のコピー アクセスを指定すると、呼び出し元のプロセスがビュー内のすべてのページに書き込み、すべてのページをプライベートにする可能性があるため、システムとプロセスのコミット料金はビュー全体に対して行われます。 新しいページの内容は元のファイルに書き戻されることはなく、ビューがマップ解除されると失われます。

FILE_MAP_EXECUTE
ファイルの実行可能ビューがマップされます (マップされたメモリはコードとして実行できます)。 ファイル マッピング オブジェクトは、PAGE_EXECUTE_READPAGE_EXECUTE_WRITECOPY、または PAGE_EXECUTE_READWRITE 保護を使用して作成されている必要があります。

Windows Server 2003 および Windows XP: この値は、Windows XP SP2 以降、Windows Server 2003 SP1 以降で使用できます。

FILE_MAP_LARGE_PAGES
Windows 10 バージョン 1703 以降では、このフラグは、をサポートする大きなページ 使用してビューをマップする必要があることを指定します。 ビューのサイズは、GetLargePageMinimum 関数によって報告される大きなページのサイズの倍数である必要があり、ファイル マッピング オブジェクトは SEC_LARGE_PAGES オプションを使用して作成されている必要があります。 lpBaseAddressに null 以外の値を指定する場合、値は GetLargePageMinimumの倍数 必要があります。

注: Windows 10 バージョン 1703 より前の OS バージョンでは、FILE_MAP_LARGE_PAGES フラグは無効です。 これらのリリースでは、セクションが SEC_LARGE_PAGES フラグを設定して作成された場合、ビューは大きなページを使用して自動的にマップされます。
FILE_MAP_TARGETS_INVALID
マップされたファイル内のすべての場所を、制御フロー ガード (CFG) の無効なターゲットとして設定します。 このフラグは、PAGE_TARGETS_INVALIDに似ています。 このフラグは、アクセス実行権限 FILE_MAP_EXECUTEと組み合わせて使用します。 これらのページ内の場所への間接呼び出しは CFG チェックに失敗し、プロセスは終了します。 割り当てられる実行可能ページの既定の動作は、CFG の有効な呼び出しターゲットとしてマークされます。
 

SEC_IMAGE 属性を使用して作成されたファイル マッピング オブジェクトの場合、dwDesiredAccess パラメーターは無効であり、FILE_MAP_READなどの任意の有効な値に設定する必要があります。

ファイル マッピング オブジェクトへのアクセスの詳細については、「ファイル マッピング のセキュリティとアクセス権の」を参照してください。

[in] dwFileOffsetHigh

ビューが開始されるファイル オフセットの高次 DWORD

[in] dwFileOffsetLow

ビューを開始するファイル オフセットの下位 DWORD。 高オフセットと低オフセットの組み合わせで、ファイル マッピング内のオフセットを指定する必要があります。 また、システムの仮想メモリ割り当て粒度と一致する必要があります。 つまり、オフセットは VirtualAlloc 割り当て粒度の倍数である必要があります。 システムの VirtualAlloc メモリ割り当て粒度を取得するには、GetSystemInfo 関数を使用します。この関数は、SYSTEM_INFO 構造体のメンバーを格納します。

[in] dwNumberOfBytesToMap

ビューにマップするファイル マッピングのバイト数。 すべてのバイトは、CreateFileMappingで指定 最大サイズ内にある必要があります。 このパラメーターが 0 (ゼロ) の場合、マッピングは指定されたオフセットからファイル マッピングの末尾まで拡張されます。

戻り値

関数が成功した場合、戻り値はマップされたビューの開始アドレスです。

関数が失敗した場合、戻り値は NULL。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

ファイルをマッピングすると、ファイルの指定された部分が呼び出し元プロセスのアドレス空間に表示されます。

アドレス空間より大きいファイルの場合は、ファイル データのごく一部のみを一度にマップできます。 最初のビューが完了したら、マップを解除して新しいビューをマップできます。

ビューのサイズを取得するには、VirtualQuery 関数を使用します。

ファイル (またはファイル マッピング オブジェクトとそのマップされたファイル) の複数のビューは、指定された時刻に同じデータが含まれている場合、一貫性のある 。 これは、ファイル ビューが、同じファイルによってサポートされているファイル マッピング オブジェクトから派生した場合に発生します。 プロセスは、DuplicateHandle 関数を使用してファイル マッピング オブジェクト ハンドルを別のプロセスに複製できます。または、別のプロセスで、OpenFileMapping 関数を使用して名前でファイル マッピング オブジェクトを開くことができます。

1 つの重要な例外では、同じファイルによってサポートされるファイル マッピング オブジェクトから派生したファイル ビューは、特定の時点で一貫性または同一になります。 一貫性は、プロセス内のビューと、異なるプロセスによってマップされるビューに対して保証されます。

例外はリモート ファイルに関連しています。 MapViewOfFile リモート ファイルで動作しますが、一貫性を保つことはありません。 たとえば、2 台のコンピューターが両方ともファイルを書き込み可能としてマップし、両方とも同じページを変更した場合、各コンピューターにはページへの独自の書き込みのみが表示されます。 ディスク上のデータが更新されると、マージされません。

ファイルのマップされたビューは、ReadFile または WriteFile 関数によってアクセスされるファイル 一貫性があるとは限りません。

メモリ マップト ファイルにポインターを格納しないでください。は、ファイル マッピングのベースからのオフセットを格納して、任意のアドレスでマッピングを使用できるようにします。

EXCEPTION_IN_PAGE_ERROR 例外から保護するには、構造化例外処理を使用して、ページ ファイル以外のファイルのメモリ マップビューに対して書き込みまたは読み取りを行うコードを保護します。 詳細については、「ファイル ビューからの読み取りと書き込みの を参照してください。

マップされたビューを使用してファイルを変更する場合、最後の変更タイムスタンプが自動的に更新されない場合があります。 必要に応じて、呼び出し元 SetFileTime を使用してタイムスタンプを設定する必要があります。

ファイル マッピング オブジェクトがページング ファイルによってサポートされている場合 (CreateFileMappinghFile パラメーターを INVALID_HANDLE_VALUEに設定して呼び出された場合)、ページング ファイルはマッピング全体を保持するのに十分な大きさである必要があります。 そうでない場合、MapViewOfFile 失敗します。 ページング ファイルによってサポートされるファイル マッピング オブジェクト内のページの初期コンテンツは 0 (ゼロ) です。

ページング ファイルによってサポートされるファイル マッピング オブジェクトが作成されると、呼び出し元は、mapViewOfFile がページを同時に予約してコミットするか (SEC_COMMIT) するか、単にページを予約するか (SEC_RESERVE) を指定できます。 ファイルをマッピングすると、マップされた仮想アドレス範囲全体がプロセス内の他の割り当てに使用できなくなります。 予約範囲のページがコミットされた後は、VirtualFreeを呼び出して解放またはコミット できません。 予約済みページとコミット済みページは、ビューがマップ解除され、ファイル マッピング オブジェクトが閉じられると解放されます。 詳細については、UnmapViewOfFile と CloseHandle 関数の を参照してください。

実行可能なアクセス許可を持つファイルを持つアプリケーションは、PAGE_EXECUTE_READWRITE または PAGE_EXECUTE_READCreateFileMapping を呼び出し、FILE_MAP_EXECUTE | または FILE_MAP_EXECUTE | MapViewOfFile を呼び出す必要があります。

Windows Server 2012 では、この関数は次のテクノロジでサポートされています。

テクノロジー サポート
サーバー メッセージ ブロック (SMB) 3.0 プロトコル はい
SMB 3.0 透過的フェールオーバー (TFO) はい
SMB 3.0 とスケールアウト ファイル共有 (SO) はい
クラスター共有ボリューム ファイル システム (CsvFS) はい
回復性のあるファイル システム (ReFS) はい
 

CsvFs を一時停止すると、この呼び出しは、ロックの競合があることを示すエラーで失敗する可能性があります。

例については、「名前付き共有メモリの作成」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー memoryapi.h (Windows.h、Memoryapi.h を含む)
ライブラリ onecore.lib
DLL Kernel32.dll

関連項目

CreateFileMapping の

ファイル ビュー の作成

DuplicateHandle の

GetSystemInfo を する

MapViewOfFileEx の

メモリ管理機能の

OpenFileMapping

SYSTEM_INFO

unmapViewOfFile の