何が起きているのか
実行ファイルをダブルクリックすると、すぐに以下のエラーが表示されます:
The application was unable to start correctly (0xc000007b). Click OK to close the application.
エラーコード 0xc000007b は、Windows NTカーネルにおける STATUS_INVALID_IMAGE_FORMAT に対応しています。意味するところは、32ビットアプリケーションが64ビットのDLLを読み込もうとした(またはその逆)ということです。これはアーキテクチャの不一致です。DLLはディスク上に存在していますが、ビット数が間違っているためWindowsが読み込みを拒否しています。
強調しておきたいのは、これは「DLLが見つからない」エラーではないということです。ファイルは存在しています。ただそのプロセスでは使用できないのです。修正方法を選ぶ際に、この違いが重要になります。
ステップ1 — 何かに手を加える前に問題のDLLを特定する
やみくもに再インストールしても時間の無駄です。まず2分かけて、原因となっているDLLを特定しましょう。Process Monitor(Sysinternals)とDependency Walkerはどちらも有効です。プロセス名でフィルタリングし、読み込み失敗イベントを探してください。
サードパーティツールがない場合は、組み込みの where コマンドを使って、WindowsがどのDLLパスを解決しているか確認できます:
where msvcp140.dll
where vcruntime140.dll
where msvcr120.dll
C:\Windows\SysWOW64\ と C:\Windows\System32\ の両方に結果が見つかるのは完全に正常です。これはWindowsが32ビットと64ビットを並行して処理する仕組みです。問題が起きるのは、32ビットアプリが誤って64ビット版を読み込んでしまう場合です。これは通常、誰かが間違ったビット数のDLLをアプリケーションフォルダに直接ドロップしたときに起こります。
DLLのアーキテクチャを直接確認するには、PowerShellに以下を貼り付けてください:
$bytes = [System.IO.File]::ReadAllBytes('C:\Windows\System32\msvcp140.dll')
$peOffset = [System.BitConverter]::ToInt32($bytes, 0x3C)
$machine = [System.BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -eq 0x8664) { "64-bit" } elseif ($machine -eq 0x14c) { "32-bit" } else { "Unknown: $machine" }
疑わしいDLLに置き換えて実行してください。32ビットアプリには 0x14c(x86)が必要です。0x8664(x64)が返ってきた場合、それが不一致の原因です。
ステップ2 — アプリケーションフォルダから不要なDLLを削除する
インストーラによっては、実行ファイルと一緒にランタイムDLLをバンドルするものがあります。バンドルされたコピーのアーキテクチャが間違っている場合、正しいシステムDLLより優先して読み込まれてしまい、アプリが動作しなくなります。
dir "C:\path\to\your\app\*.dll"
.exe と同じ場所に msvcp140.dll、vcruntime140.dll、msvcp_win.dll などのファイルがある場合は、上記のPowerShellスニペットでビット数を確認してください。アーキテクチャが間違っていれば、削除してください。 アプリケーションは System32 または SysWOW64 の正しいシステムコピーにフォールバックします。
ステップ3 — Visual C++ 再頒布可能パッケージを再インストールする(x86とx64の両方)
これで約70%のケースが解決します。C++で書かれたアプリケーションはMSVCランタイムのインストールが必要であり、適切なバリアントが破損または欠落していると、0xc000007bが発生します。
Microsoftのサイトで「Microsoft Visual C++ Redistributable latest」を検索し、以下をダウンロードしてください:
- Visual C++ 2015-2022 再頒布可能パッケージ — x86(64ビットWindowsでも32ビットアプリにはこれが必要)
- Visual C++ 2015-2022 再頒布可能パッケージ — x64
- 古いアプリでは2013年版や2012年版も必要になる場合があります
Windowsのエディションに関わらず、x86版をインストールしてください。ほとんどのゲームや古いデスクトップソフトウェアは32ビットとして配布されており、System32 ではなく SysWOW64 から読み込まれます。x86をスキップするのはよくある間違いです。
インストール後は再起動し、実際にインストールされているものを確認します:
Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*Visual C++*" } | Select-Object Name, Version | Sort-Object Name
ステップ4 — SFCとDISMでWindowsシステムファイルを修復する
破損したWindowsシステムDLLは、再頒布可能パッケージの再インストールでは修正できません。System32 内の msvcp140.dll 自体が破損している場合、どのインストーラも手を加えません。管理者として以下を実行してください:
# ステップ1: システムファイルチェッカー
sfc /scannow
# ステップ2: SFCが修復できないエラーを報告した場合は、先にコンポーネントストアを修復する
DISM /Online /Cleanup-Image /RestoreHealth
# ステップ3: DISMが完了したら再度SFCを実行する
sfc /scannow
ディスク速度によっては10〜20分かかります。「Windows リソース保護は、破損したファイルを見つけ、正常に修復しました」というメッセージが表示されれば成功です。再起動してアプリをテストしてください。
ステップ5 — 実行ファイル自体のアーキテクチャを確認する
修正方法として、単に正しいバージョンのアプリケーションを実行するだけでよい場合もあります。ベンダーが32ビットと64ビットの両方のインストーラを提供している場合、間違った方をインストールすると、まさにこのエラーが発生します。
$bytes = [System.IO.File]::ReadAllBytes('C:\path\to\app.exe')
$peOffset = [System.BitConverter]::ToInt32($bytes, 0x3C)
$machine = [System.BitConverter]::ToUInt16($bytes, $peOffset + 4)
if ($machine -eq 0x8664) { "64-bit EXE" } elseif ($machine -eq 0x14c) { "32-bit EXE" } else { "Unknown" }
64ビットが必要なのに32ビットのEXEだった場合は、アンインストールしてベンダーから正しいインストーラを入手し、最初からやり直してください。
ステップ6 — .NETフレームワークの修復(.NETベースのアプリのみ)
0xc000007bエラーの一部は、MSVCではなく.NETのインストールが破損していることが原因です。アプリが.NETベースの場合(通常はドキュメントやインストーラから確認できます)、MicrosoftのサイトからMicrosoft .NETフレームワーク修復ツールをダウンロードして実行してください。手動での操作なしに、最も一般的な.NETの破損シナリオに対処できます。
確認作業
上記のいずれかの修正を適用した後:
- 再起動する。 これは必須です。メモリに読み込まれているDLLはそうしないと更新されません。
- アプリケーションを通常通り起動する。
- まだ動作しない場合は、イベントビューアー → Windowsログ → アプリケーションを開いてください。エラーエントリを見つけると、詳細ペインに読み込みを拒否した特定のDLL名が表示されていることが多く、次に調査すべき具体的なターゲットがわかります。
# イベントビューアーから最近の0xc000007bエラーを取得する
Get-EventLog -LogName Application -EntryType Error -Newest 20 | Where-Object { $_.Message -like "*0xc000007b*" -or $_.Source -eq "Application Error" } | Format-List TimeGenerated, Message
クイックリファレンス:発生頻度順の修正方法
- 最も多い(約70%): Visual C++ 再頒布可能パッケージの再インストール — x86 + x64、2015-2022
- 2番目に多い: アプリケーションフォルダから不要なDLLを削除する
- システムファイルの破損:
DISM /RestoreHealthを実行後、sfc /scannowを実行 - .NETアプリの場合: .NETフレームワーク修復ツールを実行する
- 最終手段: アプリケーションをクリーンにアンインストールしてから再インストールする
なぜこの問題が繰り返し起きるのか
ほぼすべてのケースは、次の4つのシナリオのいずれかに起因しています:
- ソフトウェアのアップデートで、64ビットのシステムDLLが32ビットに(またはその逆に)入れ替わった
- インストーラが実行ファイルの隣に間違ったアーキテクチャのDLLをバンドルした
- アンチウイルスがランタイムDLLを静かに検疫または変更した(通知なしに)
- 不完全なアンインストールにより破損したDLLの断片が残り、クリーンなシステムコピーより優先して読み込まれるようになった
アプリケーションを配布している場合:ビルドターゲットと一致することを明示的に確認していない限り、msvcp*.dll や vcruntime*.dll をアプリケーションフォルダにバンドルしないでください。公式のMSVC再頒布可能パッケージのマージモジュールまたはスタンドアロンインストーラを使用してください。それがこれらの本来の用途です。

