-
デバッグ
【MFC】GetLastError 32「別のプロセスが使用中」:直す共有モードと使用中プロセスの調べ方
CreateFileWやDeleteFileWが失敗して、GetLastError() が32、つまりERROR_SHARING_VIOLATIONを返したときは、同じファイルをほかのハンドルが開いていて、その共有モードと今回の指定がかみ合っていません。メッセージは「別のプロセスが使用中です」です... -
文字コード
【MFC】CString::Tokenize で文字列を分割すると空欄が消える:CSV の列がずれない分け方
ログやCSVの1行をCString::Tokenizeで分割すると、たいていはそのまま使えます。困るのは、空欄の列があるときです。7列あるはずの文字列が4要素になり、3列目を読んでいるコードが4列目の値を受け取ります。 列の位置に意味があるデータなら、AfxExtractS... -
ビルド
LNK2038:RuntimeLibraryを /MDと /MTのどちらに揃えるか
コンパイルは全部通ったのに、リンクの最後でerror LNK2038: 'RuntimeLibrary' の不一致が検出されました と出て、ビルドが止まる。 ランタイム ライブラリの設定が、リンクした相手どうしで食い違っています。まずはそのエラー行に並んだ2つの値を読んで... -
GDI描画
【MFC】OnPaintのちらつき:背景消去とダブルバッファを切り分ける
MFCのアプリで、アニメーションや頻繁な再描画のある画面に、ちらつきが出ることがあります。OnPaintで描いているなら、OnEraseBkgndでTRUEを返す対策をよく見かけますね。 たしかに効きます。ただ、効くのは原因の片方だけで、代わりに前のフレームが画面... -
ビルド
C1083「include ファイルを開けません」ヘッダーはあるのに見つからないときの直し方
ビルドするとfatal error C1083が出る。でも、名指しされたヘッダーはディスクにちゃんとある。こういうときは、たいていファイルではなく検索パスのほうが原因です。 そんなときは、エラー行の先頭の語から読んでいきましょう。 C1083のエラー行の読み方 ... -
ビルド
【MFC】C4311:ポインタをDWORDに入れると64bitで値が切れる
32bit時代から保守しているコードをx64構成でビルドすると、C4311とC4312が出はじめます。原因は、たいてい64bitのポインタをDWORDのような32ビットの変数に入れている箇所です。C4311はポインタを入れている行に、C4312はその値をポインタへ戻している行... -
ビルド
LNK1120:未解決の外部参照は直前の LNK2019 / LNK2001 を見る
ビルドの最後にfatal error LNK1120: 2件の未解決の外部参照 と出て、exeができません。件数だけ言われても、どこを直せばいいのかは分かりませんよね。 見るべきは、その1つ上に並んでいるLNK2019とLNK2001の行です。出力ウィンドウを少し上へスクロール... -
UI制御
【MFC】CFileDialogの複数選択が1件だけ:バッファ不足を直す
CFileDialogにOFN_ALLOWMULTISELECTを付けて複数選択を有効にすると、DoModalはIDOKを返すのに、選んだはずの件数が返ってきません。必要なのは、ダイアログが返す一覧が全部入る大きさのバッファを自分で用意して、その先頭をm_ofn.lpstrFileに、文字数を... -
デバッグ
【MFC】0xC0000005 アクセス違反の原因を特定する手順:read/writeとアドレス値から絞り込む
Visual Studioでデバッグ実行していたMFCアプリが止まり、出力ウィンドウに0xC0000005という数字だけが残る。よくある現象ですよね。原因はこの1行から絞れます。その行に出る読み取り中か書き込み中かと、直前のアドレス値の2つを最初に読めば、NULLポイ... -
UI制御
【MFC】CEditを数値入力に制限する:ES_NUMBERで防げない符号・小数・貼り付け
数値だけを入れてほしい入力欄にES_NUMBERを付ける、というのはMFCのダイアログでよく見かける書き方です。キーボードから数字以外を打っても入りません。ただ、このスタイルはキーボードからの打ち込みにしか効かず、貼り付けた文字やSetWindowTextで設定...