Windowsで「アプリケーションを正しく起動できませんでした (0xc000007b)」を修正する

beginner🪟 Windows2026-03-25| Windows 10 / Windows 11、64ビットシステム上で動作する32ビットアプリケーション、Visual C++ 再頒布可能パッケージを使用するアプリ

Error Message

The application was unable to start correctly (0xc000007b). Click OK to close the application.
#windows#application-error#dll#vcredist#visual-c++

何が起きているのか

実行ファイルをダブルクリックすると、すぐに以下のエラーが表示されます:

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.dllvcruntime140.dllmsvcp_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*.dllvcruntime*.dll をアプリケーションフォルダにバンドルしないでください。公式のMSVC再頒布可能パッケージのマージモジュールまたはスタンドアロンインストーラを使用してください。それがこれらの本来の用途です。

Related Error Notes