ReadFileの読み込みエラーについて
こんばんは
Win32 APIでプログラミングをやっているのですが、そのAPIの中でReadFileというものがありますよね?
この関数でエラー値が出力され、第二引数としてBITMAPINFO構造体に格納するはずの値がそのままです。
以下に一部ソースを載せます
BOOL Cell_Init( HINSTANCE hInstance )
{
BITMAPINFO bmi2;
HANDLE hFile;
DWORD dwBytes;
// 作成するビットマップの情報を設定する
BITMAPFILEHEADER bmpFileHeader;
BITMAPINFO bmi;
// ビットマップのハンドルと、作成したバッファの先頭アドレスを取得
void* pImage;
HBITMAP hBitmap;
// デスクトップのDCを得る
HDC tmpDC = GetDC(GetDesktopWindow() );
// HBITMAPにHDCを結びつける
g_hdc_cell = CreateCompatibleDC( tmpDC );
DWORD er;
hFile = CreateFile("cointos.bmp", GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
er = GetLastError();
if(hFile == INVALID_HANDLE_VALUE) return 0;
ReadFile(hFile, &bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
er = GetLastError();
if(bmpFileHeader.bfType != 0x4D42) {
MessageBox(NULL, TEXT("This is not a bitmap file"), NULL, MB_OK);
return FALSE;
}
//ここでbmi2に格納される値が格納されていない(そのためでかい値のまま) そのためCreateDIBSectionではエラーを起こす
ReadFile(hFile, &bmi2, bmpFileHeader.bfOffBits - dwBytes, &dwBytes, NULL);
er = GetLastError(); // ここの部分でエラー値998が出ます
hBitmap = CreateDIBSection(tmpDC, &bmi2, DIB_RGB_COLORS, (LPVOID*)&pImage, NULL, 0);
ReadFile(hFile,pImage,
bmpFileHeader.bfSize - bmpFileHeader.bfOffBits, &dwBytes, NULL);
SelectObject( g_hdc_cell, hBitmap );
CloseHandle(hFile);
ReleaseDC(GetDesktopWindow(), tmpDC);
return TRUE;
}
なぜこうなるんでしょうか?
bmi2はBITMAPINFO構造体でローカルで宣言しています。これがポインタだと大丈夫なんですが
なぜ変数ではダメなのか分かりません。 あらかじめ確保されているスタック領域の容量限界でも
ないと思うのですが。
分かる方がいらっしゃったらよろしくお願いします。
開発環境はVS.2005 です。
お礼
こんにちは! 情報ありがとうございます ハードディスクでこの操作を成功させるには、呼び出し側は管理特権を備えていなければなりません。 •The lpFileName string should be of the form \\.\PHYSICALDRIVEx to open the hard disk x. Hard disk numbers start at zero. For example: ハードディスク x を開くには、lpFileName パラメータで \\.\PHYSICALDRIVEx と指定します。ハードディスクの番号は、0 から始まるオフセットで指定します。例を示します。 String 文字列 意味 \\.\PHYSICALDRIVE2 ユーザーのコンピュータの 3 番目の物理ドライブのハンドルを取得します どうやら管理者権限でないから失敗しているようです。 Windows7なのでUACというか、管理者権限に昇格して 実行しないといけないとおもうのですが どのように管理者権限で実行すればいいのでしょうか・・。 すみません。 もしご存知でしたら教えてくださいm(___)m
補足
exeのプロパティ→互換性で 設定を変更して 管理者権限で実行したら うまくいきました アドバイスありがとうございました!