【MFC】mfc110.dll / mfc90.dllが見つからない:VC++ 2012 / 2008の再頒布可能パッケージとx86/x64の選び方

【MFC】mfc110.dll / mfc90.dllが見つからない:VC++ 2012 / 2008の再頒布可能パッケージとx86/x64の選び方

Visual Studio 2012や2008で作られた古いMFCアプリを起動したときに、mfc110.dllやmfc110u.dllが見つからないという次のようなエラーが出たら、DLL名の数字に合った世代の再頒布可能パッケージを、アプリと同じビット数(x86 / x64)のものを入れます。

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

Visual Studio 2008で作られたアプリでは、DLL名が出ずに「サイド バイ サイド構成が正しくない」というエラーで止まることもあります(下の節)。

目次

mfc110.dll / mfc90.dllのDLL名から再頒布可能パッケージを決める

MFCのDLL名に付いている数字は、MFCのバージョンです(MFC Library Versions)。110はVisual C++ 11.0(Visual Studio 2012)、90はVisual C++ 9.0(Visual Studio 2008)のMFCです。末尾のuはUnicode版の印で、uが付いていてもいなくても入れるパッケージは同じです。

エラーに出たDLL名アプリを作ったVisual Studio入れるもの
mfc110.dll / mfc110u.dllVisual Studio 2012(VC++ 11.0)Visual C++ 2012 Update 4の再頒布可能パッケージ
mfc90.dll / mfc90u.dll、またはイベント ログにMicrosoft.VC90.MFCが見つからないと出る(下の節)Visual Studio 2008(VC++ 9.0)Visual C++ 2008 SP1の再頒布可能パッケージ(MFCセキュリティ更新)
mfc110ud.dll、mfc90d.dllなど末尾にdが付くものDebug構成でビルドしたexe入れられない。配布元がReleaseでビルドし直す
mfc100.dll、mfc120.dll、mfc140.dll別の世代mfc100・mfc120・mfc140の記事

ダウンロードは、MicrosoftのVisual C++再頒布可能パッケージのページの「Unsupported legacy versions」の欄にあります。2012 Update 4は11.0.61030.0、2008 SP1は9.0.30729.5677で、どちらもファイル名はvcredist_x86.exeとvcredist_x64.exeです。どちらもサポートが終わったランタイムなので、アプリの配布元に新しい版が無いかも確かめておきます。

再頒布可能パッケージは世代ごとに別々です。Visual Studio 2017以降の今のv14のパッケージ(vc_redist)を入れても、mfc110u.dllやmfc90u.dllは入りません。

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

パッケージは、Windowsではなくアプリのビット数に合わせます。64bit版のWindowsで32bitのアプリを動かすなら、vcredist_x86.exeを入れます。x64版のパッケージが入れるのは64bitのアプリ用のDLLで、32bitのアプリが読み込むDLLとは別のファイルです。そのため、32bitのアプリのDLL不足はx64版を入れても直りません。

x64でビルドしたMFCアプリの確認画面。Machineは0x8664。mfc110u.dllとmfc110.dllはLoadLibraryがエラー126、mfc140u.dllはC:\Windows\System32から読み込み。入れるものはvcredist_x64.exe
x64のアプリ。mfc110u.dllは見つからず(エラー126)、比べたmfc140u.dllはSystem32から読み込まれる
Win32でビルドした同じMFCアプリの確認画面。Machineは0x014C。mfc110u.dllとmfc110.dllはエラー126、mfc140u.dllはC:\Windows\SysWOW64から読み込み。入れるものはvcredist_x86.exe
同じアプリのWin32版。mfc140u.dllはSysWOW64から読み込まれる

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

dumpbin /headers YourApp.exe | findstr machine

machineの行が14Cならx86、8664ならx64です(dumpbinの使い方はVCRUNTIME140.dllの記事)。どちらか分からないときは、64bit版のWindowsにはx86版とx64版の両方を入れます。32bit版のWindowsにはx64版を入れられないので、x86版だけです。

mfc90.dllのアプリは「サイド バイ サイド構成が正しくない」で止まる

Visual Studio 2005と2008では、MFCやCランタイムのDLLは「共有サイド バイ サイド アセンブリ」としてC:\Windows\WinSxSの下に入ります(Concepts of Isolated Applications and Side-by-side Assemblies)。mfc90.dllとmfc90u.dllはMicrosoft.VC90.MFCというアセンブリに入っています。Visual Studio 2008でビルドしたexeには、どのアセンブリのどの版とアーキテクチャを使うかを書いたマニフェストが埋め込まれていて、Windowsは起動のときにWinSxSからそれを探します。見つからなければ、exeのコードが動く前に次のエラーで止まります。

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。
詳細については、アプリケーションのイベント ログを参照するか、コマンド ライン ツール sxstrace.exe を使用してください。

この文章はVisual C++ 2008に限らず、マニフェストに書かれたアセンブリが見つからないときに出ます。何が足りないかは、イベント ビューアーの「Windowsログ」→「Application」で、ソースがSideBySide、イベントIDが33のエラーを開いて確かめます。x64のexeでは次のように出ます(英語の表示のPCの例。パスは短くし、改行を入れています)。

Activation context generation failed for "...\YourApp.exe".
Dependent Assembly Microsoft.VC90.MFC,processorArchitecture="amd64",
publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" could not be found.
Please use sxstrace.exe for detailed diagnosis.

足りないアセンブリがMicrosoft.VC90.MFCで、processorArchitectureが”amd64″なら、Visual C++ 2008 SP1のvcredist_x64.exeを入れます。”x86″ならvcredist_x86.exeです。

ダウンロードサイトから拾ったmfc90u.dllをexeの横に置く方法は、この仕組みと合いません。Visual C++ 2008のライブラリはマニフェストで結び付けて使うもので、マニフェストの無いアプリがアプリのフォルダーから読み込もうとするとエラーになります(Visual C++ Libraries as Shared Side-by-Side Assemblies)。

入れても直らないとき

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

パッケージを入れたのに同じエラーが出るときは、入れたパッケージのビット数を見直します。32bitのアプリにはx86版が要ります。Visual Studio 2008のアプリなら、もう一度起動してからイベント ログのID 33を見ると、まだ足りないアセンブリが分かります。

まとめ

  • mfc110はVisual C++ 2012 Update 4、mfc90はVisual C++ 2008 SP1の再頒布可能パッケージを入れる。今のv14のパッケージでは代わりにならない。
  • x86版とx64版は、Windowsではなくアプリのビット数で選ぶ(dumpbinのmachineが14Cならx86、8664ならx64)。
  • 「サイド バイ サイド構成が正しくない」は、イベント ログのSideBySide・ID 33で足りないアセンブリとprocessorArchitectureを確かめる。
  • 末尾にdが付くDLLはDebug版で、配布元がReleaseでビルドし直す。
目次