「0xc000007b で起動しない」「0xc00007b と表示される」「32bit/64bit のビット数不一致かもしれない」――この症状は、MFC アプリでよくある起動エラーです。
アプリケーションを正しく起動できませんでした (0xc000007b)。
[OK] をクリックしてアプリケーションを閉じてください。
MFC やネイティブ C++ アプリでこのエラーが出たら、まず疑うべき代表原因は 本体 EXE と DLL の 32bit / 64bit のビット数不一致 です。特に x64 の本体に 32bit DLL が混ざるケースは典型例です。
先に確認する場所は 3 つだけです。この記事では、本体のビット数の確認、依存 DLL の特定、正しい DLL への置き換え、という順で 0xc000007b を切り分ける手順を整理します。
0xc000007b / 0xc00007b の原因チェックリスト
- 本体 EXE が
x86/x64のどちらでビルドされているか確認する - 実行フォルダに置いた DLL の
32bit/64bitが本体と一致しているか確認する Dependenciesやdumpbinで、混在している DLL を特定する
この 3 点を先に確認すると、0xc000007b の切り分けがかなり速くなります。
0xc000007b の意味:まず 32bit/64bit のビット数不一致を疑う

MFC やネイティブ C++ アプリで 0xc000007b が出たとき、最初に確認すべき代表原因が 「アプリケーション本体(EXE)のビット数と、それが読み込もうとした DLL のビット数が一致していない」 状態です。
例えば、以下のようなケースで発生します。
- パターンA: 本体EXEを x64(64bit)でビルドしたのに、古い外部ライブラリ(
xxx.dll)が x86(32bit)のまま配置されている。 - パターンB: その逆。本体は x86(32bit)なのに、同梱した外部ライブラリ(
xxx.dll)が x64(64bit)版になっている。
このような不一致があると、Windowsは64bitプロセス空間に32bitのDLLをロードすることを許しません(その逆も同様です)。ロードしようとした瞬間にOSレベルで弾かれ、0xc000007b(STATUS_INVALID_IMAGE_FORMAT)として失敗します。
解決手順:依存関係の調査と修正フロー
最初に行うのは、どの DLL のビット数が合っていないかを特定することです。
Step 1: dumpbin ツールで本体のビット数を確認する
まずは、ビルドした EXE が意図したビット数になっているか確認します。Visual Studio の「Developer Command Prompt」を開き、以下のコマンドを実行します。
dumpbin /headers YourApp.exe | findstr machine
Before (間違った設定でビルドされた例)
14C machine (x86)
After (正しい64bitビルドの例)
8664 machine (x64)
もし本体が x86 になっているのに開発環境では x64 を選んだつもりなら、構成マネージャーの設定が「Active(x64)」であっても特定のプロジェクトだけWin32向けにビルドされている可能性があります。構成マネージャーを再確認してください。
Step 2: 依存関係を調査するツールを使う
本体が正しいなら、次に確認するのは一緒にロードされる DLL です。Dependency Walker (depends.exe) や Dependencies で EXE を開きます。

- EXEをツールにドラッグ&ドロップします。
- 左側のツリーや一覧の中で、CPUの列が
x86(EXEがx64の場合)になっている赤字のDLLを探します。 - 特に、社内ライブラリやサードパーティコンポーネント(連携用の
HogeLib.dllなど)をそのまま同じフォルダにコピーしていないか確認します。
Step 3: 正しいビット数のDLLに置き換える
原因のDLLが特定できたら、対応は簡単です。
- サードパーティ製ライブラリであれば、提供元から
x64版(またはx86版)をダウンロードして同梱し直す。 - 自社製の別プロジェクトDLLなら、そのDLLプロジェクト自体を
x64構成でビルドし直す。
開発者向けTips:LoadLibrary でも同じ不一致が起きる
このエラーは起動時だけでなく、アプリ動作中の動的ロード(LoadLibrary)でも発生します。暗黙的リンク(インポートライブラリへのリンク)の場合は起動時エラーになりますが、明示的リンクの場合は以下のようになります。
#include <windows.h>
#include <iostream>
int main()
{
// 64bitアプリから32bitのDLLを動的にロードしようとした場合のシミュレーション
HMODULE hMod = ::LoadLibraryExA("LegacyPlugin32.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
if (hMod == NULL) {
DWORD err = ::GetLastError();
if(err == ERROR_BAD_EXE_FORMAT) { // 193
std::cerr << "エラー: 193 (ERROR_BAD_EXE_FORMAT) - ビットネスが不一致です。" << std::endl;
} else {
std::cerr << "別のエラー: " << err << std::endl;
}
}
return 0;
}
ログに「193」というエラーコードが残っていたら、それは APIの失敗ではなく、ビットネス混在によるロード拒否(実質的な 0xc000007b) を意味します。
まとめ(再発防止チェックリスト)
- [ ]
0xc000007bエラーが出たら、コードではなく32bit/64bitの混在を疑う - [ ] 構成マネージャーで、本体と依存プロジェクトのプラットフォーム(x64 / Win32)がすべて一致しているか確認する
- [ ] 実行フォルダにコピーしている外部DLL(OpenCV, 独自ドライバ等)のビット数が間違っていないか確認する
- [ ] 迷ったら
Dependenciesなどのツールでファイルを開き、赤くマークされたアーキテクチャ不一致のDLLを特定する
開発環境の移行期(特に VS のバージョンアップに合わせて 32bit から 64bit へ移行する際)に起きやすいエラーです。依存関係を一つずつ確認してください。
