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.dll | Visual 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版を入れても直りません。


アプリのビット数は、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でビルドし直す。
