こんばんは
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 です。
No.1ベストアンサー
- 回答日時:
>er = GetLastError(); // ここの部分でエラー値998が出ます
「メモリ ロケーションへのアクセスが無効です。」だそうです。
errlook.exeで確認できますが。
>bmi2はBITMAPINFO構造体でローカルで宣言しています。これがポインタだと大丈夫なんですが
ええと……BITMAPINFO構造体にはRGBQUADが配列で「1個」分しかありません。
ということは、1ピクセルのデータしか突っ込めません。
# モノクロビットマップなら…32ピクセル分ですかねぇ…。
# 8ビットなら4ピクセル…は無理か。たぶんパレット情報で終わり。
そこに2ピクセル以上のものを読み込もうとしたらどうなるかは判りますよね?
「ポインタだったら読めた」のは、ぶっ壊しながら読み込んだに過ぎないのではありませんか?
# バッファオーバーフローです。
ローカル変数はぶっ壊した場合にスタックともども壊していきますしねぇ。
読み込み処理なら…
http://www.kumei.ne.jp/c_lang/sdk2/sdk_169.htm
とか参考になりますかねぇ。
回答ありがとうございます
BITMAPINFO構造体のメンバ変数bmiColorsにビットマップ情報を加えていくから
たしかにローカルで宣言しただけじゃダメですね。
メモリが足りないので領域を破壊していくのは当然だし
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
ホテルを選ぶとき、これだけは譲れない条件TOP3は?
ホテルを探す時、予約サイトで希望条件の絞り込みができる便利な世の中。 あなたは宿泊先を決めるとき「これだけは譲れない」と思う条件TOP3を教えてください。
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
シリアル通信の受信待ちについて
C言語・C++・C#
-
エディットコントロールでEnter押した時の動作
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セグメントエラー
-
C言語のポインタに直接アドレス...
-
init関数の意味
-
Run-Time Check Failure #3とい...
-
Wordでのリンク方法(Ctrlキー...
-
LPSTR型の初期化について
-
C言語で構造体の参照渡しができ...
-
popenした子プロセスのプロセス...
-
fopne で失敗する原因
-
基本アルゴリズムの『返す』の...
-
ポインタ同士の割り算
-
main関数以外での文字列の表示...
-
自作DLLの引数について、ポイン...
-
C言語でのconstを返す関数
-
参照型で受け取った引数をポイ...
-
x64プログラムでアドレスが32bi...
-
#define NULL ((void *)0) の弊害
-
デバイスハンドルとは?
-
C言語について教えてください。
-
VB6でポインタ?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインタに直接アドレス...
-
セグメントエラー
-
init関数の意味
-
fopne で失敗する原因
-
Run-Time Check Failure #3とい...
-
戻り値で構造体を返すことは可...
-
ExcelVBAでのkernel32(64bit)
-
LPSTR型の初期化について
-
参照型で受け取った引数をポイ...
-
C言語でのconstを返す関数
-
ハンドルはポインタか
-
ハンドル、アドレス、ポインタ...
-
PASCALとFARの意味
-
CWnd::EnableWindow()の扱い方
-
ポインタについて
-
デバイスハンドルとは?
-
C言語の文字列?処理 strcpyやl...
-
ポインタのミスでOS壊れるの...
-
C++ vectorのbeginについて
-
基本アルゴリズムの『返す』の...
おすすめ情報