-
GDI描画
【MFC】GDI ハンドル上限:CreatePen が NULL を返し始めた瞬間の数を実機で数える
長く動かしているMFCアプリで、線や枠が急に描かれなくなることがあります。GDIオブジェクトを解放しないまま作り続けるとプロセスあたりのハンドル数が上限に達し、そこから先のCreatePenは例外もエラーダイアログも出さずにNULLを返します。 最初に見る... -
ビルド
【MFC】MSB8020: ビルドツールが見つからない:再ターゲットか、古いツールセット追加か
MSB8020でビルドが止まったとき、直し方は古いツールセットをビルド機に入れるか、プロジェクトを再ターゲットするかです。MFCアプリで後者を選ぶと、exeが要求するMFCランタイムがmfc100.dllやmfc120.dllから14系へ変わり、配布先に入れる再頒布可能パッ... -
近代化
【MFC】64bit化でレジストリの設定が読めない:Wow6432Node と KEY_WOW64_32KEY
64bit化して読めなくなる設定は、ほぼHKEY_LOCAL_MACHINE\SOFTWARE配下だけです(HKEY_CURRENT_USERにもCLSIDのような例外はあります)。CWinApp::SetRegistryKeyが使うHKEY_CURRENT_USER\Software\会社名\アプリ名 は共有キーで、32bit版と64bit版が同じ... -
デバッグ
【MFC】GetLastError 3「指定されたパスが見つかりません」:コード2との違いと確認順
CreateFileWの直後にGetLastError() を読み、3が返ってきた。そんなときにまず疑うのは、末尾のファイル名ではなく、その手前のディレクトリです。3はERROR_PATH_NOT_FOUND。似たエラーである2(ERROR_FILE_NOT_FOUND)との違いを、実際の戻り値を見ながら... -
デバッグ
【MFC】GetLastErrorの数値をFormatMessageで文章にする:メッセージが空になる原因
GetLastError() が返した数値を人が読める文章にするのはFormatMessageです。ところが同じコードで、エラー2なら「指定されたファイルが見つかりません。」が返るのに、エラー193では戻り値が0になって何も入らない。原因はロケールでも権限でもなく、193... -
ビルド
【MFC】mfc140.dllが見つからない:v14再頒布パッケージの対応OSとx86/x64
MFCアプリを起動したときにmfc140.dllが見つからない(またはmfc140u.dll)と出たら、まず対象OSとアプリを作ったVisual Studioの世代を確認します。Windows 10 / 11またはWindows Server 2016以降で、Visual Studio 2017〜2026のMSVC Build Toolsを使った... -
デバッグ
【MFC】_CrtCheckMemoryでメモリ破壊の発生区間を挟み込む
MFCアプリが、メモリを書き壊した場所では止まらず、後のnewやdeleteで落ちることがあります。最初に置くのは、疑わしい処理の前後にある2つの_CrtCheckMemoryです。前がTRUE、後がFALSEなら、調べる範囲はその間に限れます。 最初に置く2つのチェックポイ... -
デバッグ
【MFC】CreateFileがGetLastError 5(ERROR_ACCESS_DENIED)で失敗するときの確認箇所
CreateFileが失敗してGetLastError() が5(ERROR_ACCESS_DENIED)を返すと、とりあえず管理者として実行して通るかを試したくなりますが、管理者で開けても、標準ユーザーで起動すればまた5になります。先に、書き込み先がProgram Filesのような保護された... -
ビルド
【MFC】mfc100u.dll / mfc100.dll が見つからない:VC++ 2010 再頒布パッケージの特定と、MFC の静的リンクで依存を外す
手元では普通に動いていたMFCアプリが、配布先のPCではmfc100u.dllが見つからないと言って起動しません。 mfc100u.dll が見つからないため、コードの実行を続行できません。 プログラムを再インストールすると、この問題が解決する場合があります。 必要な... -
デバッグ
【MFC】GetLastError 6(ERROR_INVALID_HANDLE):無効なハンドルの原因と切り分け
ワーカースレッドの停止用に作ったイベントを、スレッドがまだ使っている間にダイアログ側でCloseHandleしてしまう。その後でSetEventを呼ぶと戻り値は0、GetLastError()は6、つまりERROR_INVALID_HANDLEです。この記事では、閉じたハンドルを使い回したこ...