3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(VC++)Visual Studio 2008 でMFCアプリケーションを作るときのDLL依存問題

久しぶりに C/C++ && MFC アプリケーションを作ることとなりました。

(前に作ったのは Visual C++ 6.0 時代。大昔な気がしますね)

で、とりあえず MFC を使って何も加工してないVSのウィザードが作り出すダイアログアプリケーションを、セットアップしたての XP の素の環境で動かすと、下記のようなエラーダイアログが。。

「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。

アプリケーションを再度インストールすることにより問題が解決する場合があります。」

ちなみに、サーバとして使ってるので比較的クリーンな(無駄ソフトが入ってない) Windows Server 2008 上では下記エラーとなりました。

「このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを正しく開始できませんでした。

詳細については、アプリケーションのイベント ログを参照してください。」

イベントログを見ろというので、見ると下記のように。。

"D:\sample01.exe" のアクティブ化コンテキストの生成に失敗しました。 従属アセンブリ Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" が見つかりませんでした。

まあ、どうやらCのランタイムライブラリがないということでしょうかね。

これの解決方法が下記掲示板に出てました。

http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200509/05090039.txt

具体的には、msvrcr90d.dllをアプリケーション動作環境に入れてやるか、Visual Studio で下記のように設定してやります。

プロジェクトのプロパティ → 構成プロパティ → C/C++ → コード生成 で、

ランタイム ライブラリ の値を 「マルチスレッド DLL (/MD)」 から 「マルチスレッド (/MT)」に変更する。

このコンパイル設定はMSDN:/MD、/MT、/LD (ランタイム ライブラリの使用)で、C++のランタイム関する情報はMSDN:Visual C++ ファイルの再配布

MSDN:MFC ライブラリの再配布

MSDN:方法 : XCopy を使用して配置する

にあります。VS2005以降の場合は、DLL地獄解消のためSideBySide対応らしいので、DLL使うためにはマニフェストでいろいろ定義してやらないといけないらしいですね。詳細はいずれ。。

ちなみに、C++のランタイムセットアップファイルは C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\vcredist_x86\vcredist_x86.exe に、単体のDLLファイルは C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86 配下に保存されています。

これについては、VisualStudio.NET 2005 SP1 の罠でも少し取り上げられています。

あと、MSVCR80.dll/MSVCR90.dllに依存しないようにする方法によると、作成したアプリケーションがどの DLL に依存しているかは、dumpbin /dependents "hoge.exe" で調べられるようです。