【MFC】VCRUNTIME140.dllが見つからない:DLL名とx86/x64から入れる再頒布パッケージを決める

【MFC】VCRUNTIME140.dllが見つからない:DLL名とx86/x64から入れる再頒布パッケージを決める

アプリを起動したときに、VCRUNTIME140.dllが見つからないという次のエラーが出たら、MicrosoftのVisual C++ v14再頒布可能パッケージを入れます。Windowsが64bitだからx64版、と手が伸びますが、アプリと同じビット数(x86 / x64)のものを選びます。

VCRUNTIME140.dll が見つからないため、コードの実行を続行できません。
プログラムを再インストールすると、この問題が解決する場合があります。

DLL名の末尾にDが付くときや、api-ms-win-crt-で始まるときは、入れるものが違います(下の表)。

目次

VCRUNTIME140.dll / MSVCP140.dllのDLL名から再頒布パッケージを決める

VCRUNTIME140.dllやMSVCP140.dllといった、名前に140が付くDLLは、Visual Studio 2015以降のv14系のツールセットで作ったアプリが使うランタイムです。Visual Studio 2017、2019、2022、2026のMSVC Build Toolsで作ったアプリは、同じ最新のv14再頒布可能パッケージを使えます(最新の再頒布可能パッケージのページ)。

エラーに出たDLL名中身入れるもの
VCRUNTIME140.dllC/C++のプログラムの起動と終了などを受け持つランタイムv14再頒布可能パッケージ
VCRUNTIME140_1.dllVCRUNTIME140.dllと組で使うランタイム。x64のアプリが使い、x86のアプリは使わないv14再頒布可能パッケージ(まずx64版)
MSVCP140.dll(MSVCP140_1.dll、MSVCP140_2.dllなども)C++標準ライブラリ(std::vectorなど)v14再頒布可能パッケージ
mfc140.dll / mfc140u.dll共有DLL版のMFCv14再頒布可能パッケージ(mfc140.dllの記事)
VCRUNTIME140D.dll、MSVCP140D.dll、ucrtbased.dllなど末尾にDが付くものDebug版のランタイム入れられない。配布元がReleaseでビルドし直す
api-ms-win-crt-runtime-l1-1-0.dllなどユニバーサルCRT(UCRT)Windows 10以降はOSに含まれる。下の「入れても直らないとき」を見る
mfc120.dll、mfc100.dllなど140以外別の世代のランタイムDLL名から世代を調べる早見表

表の上の4行は、どれも同じv14再頒布可能パッケージに入っています。VCRUNTIME140.dllのあとにMSVCP140.dllやmfc140u.dllのエラーが続いて出る場合も、同じパッケージを1回入れれば、まとめて入ります。

x86版かx64版かはアプリのビット数で選ぶ

再頒布可能パッケージはアーキテクチャごとに1つずつ、vc_redist.x86.exeとvc_redist.x64.exeのように別のファイルで配られていて、Windowsではなくアプリの対象アーキテクチャに合わせて選びます。64bit版のWindowsでも、32bitのアプリを動かすにはx86版が要ります。

アプリ入れるパッケージMicrosoftの固定リンク
32bit(Win32 / x86)x86版vc_redist.x86.exe
64bit(x64)x64版vc_redist.x64.exe
x64でビルドしたMFCアプリの動作環境の確認ダイアログ。対象はx64でMachineは0x8664。mfc140u.dll、MSVCP140.dll、VCRUNTIME140_1.dll、VCRUNTIME140.dllをC:\Windows\System32から読み込み、入れるものはvc_redist.x64.exe
x64のアプリ。VCRUNTIME140_1.dllを含む4つをSystem32から読み込んでいる
Win32でビルドした同じMFCアプリの動作環境の確認ダイアログ。対象はx86でMachineは0x014C。mfc140u.dll、MSVCP140.dll、VCRUNTIME140.dllをC:\Windows\SysWOW64から読み込み、VCRUNTIME140_1.dllの行は無い
同じアプリのWin32版。VCRUNTIME140_1.dllは無く、読み込み元はSysWOW64

同じソースでも、x64版はC:\Windows\System32の64bitのDLLを、Win32版はC:\Windows\SysWOW64の32bitのDLLを読み込んでいます。vc_redist.x64.exeが入れるのは64bitのライブラリで、32bitのライブラリはvc_redist.x86.exeが入れるので、32bitのアプリのDLL不足はx64版を入れても直りません。

VCRUNTIME140_1.dllは、x64版のアプリだけが取り込んでいました。エラーにこの名前が出ていたら、x64版を先に入れて試します。

アプリがx86かx64かを確かめる

やり方はソースの有無で変わります。ソースがあるなら、Visual Studioの構成マネージャーを開き、exeを作るプロジェクトの「プラットフォーム」の列を見ます。Win32ならx86版、x64ならx64版です。ツールバーのソリューション プラットフォームは、プロジェクトのプラットフォームと一致するとは限りません(ソリューションのx64に、プロジェクトのWin32を割り当てることもできます)。

exeしか手元に無いときや、配るexeそのもので確かめたいときは、Visual Studioが入っているPCのDeveloper Command Promptで、exeのファイル ヘッダーを表示します。

dumpbin /headers YourApp.exe | findstr machine

machineの行が8664ならx64、14Cならx86です。exeが取り込んでいるDLLの一覧は、次のコマンドで出ます(/DEPENDENTS)。

dumpbin /dependents YourApp.exe

Visual Studioも無い利用者のPCで、配布元の資料からもビット数が分からないときは、64bit版のWindowsならx86版とx64版の両方を入れます。32bit版のWindowsにはx64版を入れられないので、x86版だけを入れます。

入れても直らないとき

エラーのDLL名の末尾にDが付いている(VCRUNTIME140D.dll、MSVCP140D.dll、ucrtbased.dllなど)ときは、Debug構成でビルドしたexeが配られています。Debug版のDLLは再頒布できず(再頒布するDLLの決め方)、再頒布可能パッケージにも入っていないので、配布元がReleaseでビルドし直す必要があります。

api-ms-win-crt-runtime-l1-1-0.dllのようにapi-ms-win-crt-で始まる名前は、ユニバーサルCRT(UCRT)の一部です。UCRTはWindows 10以降ではOSの部品で、Windows Updateで管理されています。この名前のエラーが出ているなら、Windows 10より前のOSで動かしていないかを確かめます。最新のv14再頒布可能パッケージはWindows 10 / 11とWindows Server 2016以降にしか対応していないので、古いOSではアプリの配布元に、そのOS向けの手順があるかを確かめます。

パッケージを入れたのに直らないときは、入っている版が古い場合があります。再頒布可能パッケージの版は、アプリのビルドに使ったMSVC Build Toolsと同じか新しいものが要ります。古いインストーラーを使い回さず、上の固定リンクから取り直して入れ直します。

ダウンロードサイトから拾ったVCRUNTIME140.dllをexeの横に置く方法は避けます。再頒布可能パッケージで入れたライブラリはWindows Updateで更新されますが、exeの横に置いたDLLは、置いた人が自分で更新し続けることになります。

まとめ

  • VCRUNTIME140.dll、VCRUNTIME140_1.dll、MSVCP140.dll、mfc140u.dllは、どれもVisual C++ v14再頒布可能パッケージに入っている。
  • x86版とx64版は、Windowsではなくアプリのビット数で選ぶ(dumpbinのmachineが14Cならx86、8664ならx64)。
  • 末尾にDが付くDLLはDebug版で、配布元がReleaseでビルドし直す。api-ms-win-crt-で始まるDLLは、Windows 10以降ならOSに含まれる。
目次