Visual C++ランタイムライブラリが見つからず起動が失敗する
Visual C++ランタイムライブラリがインストールされていない環境でも動作するように、 アーカイブにVisual C++ランタイムライブラリを同梱していた(プライベートアセンブリ)。 しかしこのライブラリの配置方法とバージョンに問題があり、manifestに対応したWindowsXP以降では読み込まれない状態だった。 よってVisual C++ランタイムライブラリがインストールされていない環境ではライブラリが参照できず、起動が失敗する。
アーカイブに同梱しているライブラリ(Microsoft.VC90.CRT)を、MIDITrail.exeと同一階層に配置していた。 (WireSharkを参考にしたのだが・・・)
MIDITrail.exe Microsoft.VC90.CRT.manifest msvcm90.dll msvcp90.dll msvcr90.dll
本来は Microsoft.VC90.CRT フォルダの下におかなければならない。
MIDITrail.exe Microsoft.VC90.CRT/ Microsoft.VC90.CRT.manifest msvcm90.dll msvcp90.dll msvcr90.dll
ただしこれが有効なのは、manifestに対応したWindowsXP以降であるため、 Windows2000では Microsoft.VC90.CRT フォルダにパスを通すか、 これまで通りMIDITrail.exeと同一階層に置くしかない。
Visual Studio 2008 sp1 VC++ でビルドすると、ビルドモジュール(EXE/DLL)に埋め込まれるmanifestには、 使用するMicrosoft.VC90.CRTのバージョンが 9.0.21022.8 と指定されている。
ところが、Visual Studio 2008 sp1の再配布用のフォルダに格納されているMicrosoft.VC90.CRTのバージョンは 9.0.30729.4148 である。 (%PROGDIR%\Microsoft Visual Studio 9.0\VC\Redist\x86\Microsoft.VC90.CRT)
Visual C++ランタイムライブラリがインストールされていない環境で 9.0.21022.8を探しても、 プライベートアセンブリで配置されているのが 9.0.30729.4148 なので、見つからないことになる。 manifestに古いバージョンを埋め込んでしまうのは、sp1適用で発生する問題らしい。
対策方針として考えられるのは次の二つ。
1.を選択すると、DirectXと同様にパッケージのダウンロードとインストール作業をユーザーにお願いすることになる。 もっとも理想的であるが、アプリケーションを使ってもらうまでの敷居が高くなるのが問題。
2.を選択すると、manifestに対応していないWindows 2000で別の対策が必要になる。 Windows 2000の場合は、次のいずれかをユーザーにお願いすることになる。
ユーザーの導入しやすさを優先し、プライベートアセンブリを継続する。 Windows 2000ユーザーの比率は少ないと思われるし、 あえてWindows 2000を利用し続けているユーザーは、 問題に対処する技術レベルが高いと推測する(勝手な想像ですが・・・)。
MIDITrail.exe Microsoft.VC90.CRT/ Microsoft.VC90.CRT.manifest msvcm90.dll msvcp90.dll msvcr90.dll
プロジェクトのプロパティで、プリプロセッサの定義に次の文字列を追加する。
_BIND_TO_CURRENT_VCLIBS_VERSION
Windows2000環境での対応方法を追記する。 次のいずれかを選択してもらう。
発生条件
現象
MIDITrailを起動させると、次のエラーメッセージが表示されて終了する。