0xc00007b エラーの直し方:32bit/64bit 不一致を dumpbin で特定する

【MFC】0xc000007b エラーの直し方:32bit/64bit のビット数不一致で起動しない原因と修正手順

「0xc000007bで起動しない」「0xc00007bと表示される」「32bit/64bitのビット数不一致かもしれない」――この症状は、MFCアプリでよくある起動エラーです。

アプリケーションを正しく起動できませんでした (0xc000007b)。
[OK] をクリックしてアプリケーションを閉じてください。

MFCやネイティブC++ アプリでこのエラーが出たら、まず疑うべき代表原因は 本体EXEとDLLの32bit / 64bitのビット数不一致 です。特にx64の本体に32bit DLLが混ざるケースは典型例です。

先に確認する場所は3つだけです。この記事では、本体のビット数の確認、依存DLLの特定、正しいDLLへの置き換え、という順で0xc000007bを切り分ける手順を整理します。

目次

0xc000007b / 0xc00007bの原因チェックリスト

  1. 本体EXEがx86 / x64のどちらでビルドされているか確認する
  2. 実行フォルダに置いたDLLの32bit / 64bitが本体と一致しているか確認する
  3. Dependenciesやdumpbinで、混在しているDLLを特定する

この3点を先に確認すると、0xc000007bの切り分けがかなり速くなります。


0xc000007bの意味:まず32bit/64bitのビット数不一致を疑う

64bitの本体EXEが32bitのDLLを読み込もうとしてクラッシュする概念図

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を開きます。

Dependenciesツールで赤くエラーになっている32bit DLLを特定している画面
  1. EXEをツールにドラッグ&ドロップします。
  2. 左側のツリーや一覧の中で、CPUの列がx86(EXEがx64の場合)になっている赤字のDLLを探します。
  3. 特に、社内ライブラリやサードパーティコンポーネント(連携用の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へ移行する際)に起きやすいエラーです。依存関係を一つずつ確認してください。

目次