【MFC】msvcr100.dll / msvcr120.dllが見つからない:Cランタイムの名前から入れる再頒布可能パッケージを決める

【MFC】msvcr100.dll / msvcr120.dllが見つからない:Cランタイムの名前から入れる再頒布可能パッケージを決める

古いアプリを起動したときに、msvcr100.dllやmsvcr120.dllが見つからないという次のようなエラーが出たら、DLL名の数字とアプリのビット数(x86 / x64)から、入れる再頒布可能パッケージを決めます。

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

msvcrで始まるDLLは、Visual Studio 2013までのVisual C++で作ったアプリが使うCランタイムです。同じ世代のMFCのDLLと同じ再頒布可能パッケージに入っているので、MFCを使うアプリでも使わないアプリでも、入れるものは同じです。

目次

msvcr100.dll / msvcr120.dllの数字から再頒布可能パッケージを決める

Microsoftの再頒布するDLLの決め方には、Visual Studio 2015より前のCランタイムは、名前に版の数字が付いた再頒布可能なDLLだったと書かれています。msvcr100.dllの100はVisual C++ 10.0(Visual Studio 2010)、110は11.0(2012)、120は12.0(2013)です。同じ数字のmsvcp100.dllなどはC++標準ライブラリ(std::vectorなど)のDLLで、入れるパッケージはmsvcrと同じです。

エラーに出たDLL名アプリを作ったVisual Studio入れるもの
msvcr100.dll / msvcp100.dllVisual Studio 2010(VC++ 10.0)Visual C++ 2010 SP1の再頒布可能パッケージ(10.0.40219.325)
msvcr110.dll / msvcp110.dllVisual Studio 2012(VC++ 11.0)Visual C++ 2012 Update 4の再頒布可能パッケージ(11.0.61030.0)
msvcr120.dll / msvcp120.dllVisual Studio 2013(VC++ 12.0)Visual C++ 2013の再頒布可能パッケージ(12.0.40664.0)
msvcr90.dll / msvcr80.dllVisual Studio 2008 / 2005Visual C++ 2008 SP1 / 2005 SP1の再頒布可能パッケージ。DLL名ではなく「サイド バイ サイド構成が正しくない」で止まることがある(サイド バイ サイド アセンブリ)
msvcr100d.dll、msvcp120d.dllなど末尾にdが付くものDebug構成でビルドしたexe入れられない。配布元がReleaseでビルドし直す
VCRUNTIME140.dllVisual Studio 2015以降今のv14の再頒布可能パッケージ(DLL名の早見表)

2010・2012・2013のパッケージは、MicrosoftのVisual C++再頒布可能パッケージのページの「Unsupported legacy versions」の欄からダウンロードできます。表の版の数字はこのページに載っている最新の版で、ファイル名はどれもvcredist_x86.exeとvcredist_x64.exeです。どれもサポートが終わったランタイムなので、アプリの配布元に新しい版が無いかも確かめておきます。

Visual Studio 2015からは、CランタイムがVCRUNTIME140.dllとユニバーサルCRT(UCRT)に分かれました(同じ「再頒布するDLLの決め方」のページ)。今のv14のパッケージ(vc_redist)は2015以降のアプリのためのもので、msvcr100.dllやmsvcr120.dllはv14のパッケージでは入りません。再頒布可能パッケージは世代ごとに別々に入れます。

同じ世代のmsvcp100.dllやmfc100u.dllも同じパッケージで入る

Visual Studio 2010の資料Redistributing Visual C++ Filesには、Visual C++の再頒布可能パッケージは「Visual C++のライブラリをすべてインストールし、登録する」と書かれています。同じ時代の配布の手順では、UnicodeのMFCアプリを動かすのにmfc100u.dllとmsvcr100.dllの2つを使っています。共有DLLのMFCを使うアプリは、MFCのDLLとCランタイムのDLLの両方を読み込むので、msvcr100.dllのエラーを直したあとにmfc100u.dllのエラーが出ることもあります。その場合も、同じVisual C++ 2010 SP1のパッケージを入れます(mfc100u.dllについてはmfc100u.dllの記事)。

ただし、msvcr100.dllが1つあるからといって、同じ世代のDLLが全部そろっているとは限りません。MFCのダイアログアプリから、msvcr・msvcp・mfcの3つを世代ごとにLoadLibraryで読み込んでみました。読み込めたものは読み込み元のフォルダーとファイルバージョンを、読み込めなかったものはエラー番号を表に出しています。

x64でビルドしたMFCアプリの確認画面。Machineは0x8664。msvcr100.dllとmsvcp100.dllはC:\Windows\System32から読み込み、ファイルバージョンは10.0.40219.325。mfc100u.dllはエラー126。msvcr110・msvcr120の世代は3つとも読み込め、MSVCR100.dllを取り込むexeは起動できた
x64のアプリ。msvcr100.dllとmsvcp100.dllはあるが、mfc100u.dllは読み込めない(エラー126)

Visual Studio 2026で作ったMFCのダイアログを、x64とWin32でビルドして試しました。この画像のPCでは、64bitのmsvcr100.dllとmsvcp100.dllがC:\Windows\System32にありましたが、mfc100u.dllはエラー126(指定されたモジュールが見つかりません)で読み込めませんでした。2012と2013の世代は、msvcr・msvcp・mfcの3つとも読み込めています。何がmsvcr100.dllとmsvcp100.dllだけを入れたのかは確かめていません。2010の資料には、パッケージのほかに、マージモジュールやexeと同じフォルダーへのコピーでDLLを1つずつ配る方法も書かれています。同じ世代のDLLが次々に見つからないと言われるときは、DLLを1つずつ探すよりも、その世代のパッケージを入れるほうが早く済みます。

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

再頒布可能パッケージのアーキテクチャは、Windowsではなくアプリに合わせます(再頒布可能パッケージのページ)。64bit版のWindowsでは、C:\Windows\System32は64bitのアプリのためのフォルダーで、32bitのアプリがSystem32を見に行くとC:\Windows\SysWOW64へ振り替えられます(File System Redirector)。そのため、System32に64bitのmsvcr100.dllがあっても、32bitのアプリはそれを読み込めません。

上と同じPCで、同じアプリをWin32でビルドして動かしました。表の最後の行は、MSVCR100.dllを取り込むだけの小さなexeを起動した結果です。x64版のexeは起動できましたが(上の画像の最後の行)、Win32版のexeは0xC0000135で起動できませんでした。冒頭のエラーの文は、この0xC0000135の意味をWindowsから取ったものです。

Win32でビルドした同じMFCアプリの確認画面。Machineは0x014C。msvcr100.dll、msvcp100.dll、mfc100u.dllはエラー126、2012と2013の世代はC:\Windows\SysWOW64から読み込み。MSVCR100.dllを取り込むexeは0xC0000135で起動できない。入れるものはvcredist_x86.exe
同じアプリのWin32版。msvcr100.dllは読み込めず、MSVCR100.dllを取り込むexeは起動できない(0xC0000135)

このPCで32bitのアプリを動かすには、Visual C++ 2010 SP1のvcredist_x86.exeが要ります。x64版のパッケージが入っていても、32bitのアプリのエラーは直りません。

アプリのビット数は、Visual Studioが入っているPCならDeveloper Command Promptで確かめられます。

dumpbin /headers YourApp.exe | findstr machine

machineの行が14Cならx86、8664ならx64です。上の画像の1行目の「Machine = 0x8664」「Machine = 0x014C」は、exeのこの値をアプリ自身が読んで出したものです。どちらか分からないときは、64bit版のWindowsにはx86版とx64版の両方を入れます。32bit版のWindowsにはx64版を入れられない(再頒布可能パッケージのページ)ので、x86版だけです。

入れても直らないとき

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

パッケージを入れたのに同じエラーが出るときは、入れたパッケージの世代とビット数を見直します。msvcr120.dllのエラーに2010のパッケージを入れても直らず、32bitのアプリにはx86版が要ります。同じ世代でも、入れたパッケージの版がアプリより古いと足りないことがあります。Microsoftは、パッケージのメジャー版がアプリを作ったツールセットと同じで、マイナー版が同じか新しいことを求めています(再頒布するDLLの決め方)。古いインストーラーを使い回さず、上の表の版を入れ直します。

ダウンロードサイトから拾ったmsvcr100.dllをexeの横に置く方法は避けます。exeのフォルダーに置いたDLLはWindows Updateで更新されず、更新は置いた側が受け持つことになります。Microsoftは、再頒布可能パッケージで中央に入れる方法を勧めています(再頒布するDLLの決め方)。

まとめ

  • msvcr100.dllはVisual C++ 2010 SP1、msvcr110.dllは2012 Update 4、msvcr120.dllは2013の再頒布可能パッケージを入れる。同じ数字のmsvcpやmfcのDLLも同じパッケージに入る。
  • 今のv14のパッケージ(vc_redist)ではmsvcr100.dllなどは入らない。世代ごとに別々に入れる。
  • x86版とx64版は、Windowsではなくアプリのビット数で選ぶ。System32に64bitのmsvcr100.dllがあっても、32bitのアプリはSysWOW64を探すので起動できない。
  • 末尾にdが付くDLLはDebug版で、配布元がReleaseでビルドし直す。
目次