[HCPC] Win32 > IO > ReadFile(Memory Mapped File)

// Win32でのファイルリード(メモリマップドファイル用) Ver.2008.4.24
// Copyright (C) 2008 T.Hirase, All rights reserved.
//-----------------------------------------------------
#include <windows.h>

int main()
{
    // 変数宣言
    HANDLE      fileHandle;            // ファイルアクセス用のハンドル
	HANDLE      mmapHandle;            // メモリマップドファイル用のハンドル
    LPVOID      mmapView;              // メモリにマッピングされたファイルビュー
	const SIZE_T viewSize= 1024LL;
	const DWORD  viewSizeHigh = (viewSize & 0xffffffff00000000) >> 32;
	const DWORD  viewSizeLow  = (viewSize << 32) >> 32;
	DWORD fileOffsetHigh = 0;
	DWORD fileOffsetLow = 0;

    // ファイルを開く(ファイルへのハンドル取得)
    fileHandle = CreateFile(
        TEXT("test.wav"),          // ファイルのパス
        GENERIC_READ,              // 読み取りモードで開く。
        FILE_SHARE_READ,           // 排他処理の設定。読み取りモードでは、他プロセスも読める。
        NULL,
        OPEN_EXISTING,             // ファイルがある場合だけ開く。
        FILE_FLAG_SEQUENTIAL_SCAN, // シーケンシャルなアクセスを行う。
        NULL);
    if (fileHandle == INVALID_HANDLE_VALUE)
    {
        DWORD invalidReason = GetLastError();
        DebugBreak();
    }

	// ファイルマッピングオブジェクトの作成
	mmapHandle = CreateFileMapping(fileHandle, NULL, PAGE_READONLY | SEC_COMMIT, viewSizeHigh, viewSizeLow, NULL);
    if (mmapHandle == INVALID_HANDLE_VALUE || mmapHandle == NULL)
    {
        DWORD invalidReason = GetLastError();
        DebugBreak();
    }

	// ファイルのマッピング
	mmapView = MapViewOfFile(mmapHandle, FILE_MAP_READ, fileOffsetHigh, fileOffsetLow, viewSize);

	// マッピング解除
	UnmapViewOfFile(mmapView);
	mmapView = NULL;

    // ハンドル解放
	CloseHandle(mmapHandle);
    CloseHandle(fileHandle);

    return 0;
}

更新履歴

2008.04.24
(初)