OSDN Ticket Archive


Ticket #22102

Visual C++ランタイムライブラリが見つからず起動が失敗する

登録: 2010-06-05 10:16 最終更新: 2010-06-05 16:44

報告者:
yknk
担当者:
yknk
チケットの種類:
バグ
状況:
完了
コンポーネント:
MIDITrail Ver.1.0.x for Windows
マイルストーン:
Version 1.0.1 (完了済み)
優先度:
9 - 最高
重要度:
9 - 最高
解決法:
なし
ファイル:
なし

詳細

発生条件

  • (たぶん)Windows XP以降
  • Visual C++ランタイムライブラリ(Microsoft.VC90.CRT)が C:\Windows\winsxs にインストールされていない

現象

MIDITrailを起動させると、次のエラーメッセージが表示されて終了する。

This application has failed to start because the application configuration is incorrect. Reinstalling application may fix this problem.

チケットの履歴

2010-06-05 10:16 更新者: yknk
  • 新しいチケット "Visual C++ランタイムライブラリが見つからず起動が失敗する" が作成されました
2010-06-05 11:10 更新者: yknk
コメント

問題点概要

Visual C++ランタイムライブラリがインストールされていない環境でも動作するように、 アーカイブにVisual C++ランタイムライブラリを同梱していた(プライベートアセンブリ)。 しかしこのライブラリの配置方法とバージョンに問題があり、manifestに対応したWindowsXP以降では読み込まれない状態だった。 よってVisual C++ランタイムライブラリがインストールされていない環境ではライブラリが参照できず、起動が失敗する。

問題点1: 同梱しているライブラリの配置方法が間違っている

アーカイブに同梱しているライブラリ(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と同一階層に置くしかない。

問題点2: ビルドモジュールに埋め込まれるmanifestの指定バージョンと同梱しているライブラリのバージョンが異なる

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適用で発生する問題らしい。

2010-06-05 11:31 更新者: yknk
コメント

対策方針の検討

対策方針として考えられるのは次の二つ。

  1. プライベートアセンブリをやめる。VC++ 2008 SP1 再頒布可能パッケージの適用をユーザーにお願いする。
  2. プライベートアセンブリを継続する。manifestとライブラリの配置場所を正しくする。

1.を選択すると、DirectXと同様にパッケージのダウンロードとインストール作業をユーザーにお願いすることになる。 もっとも理想的であるが、アプリケーションを使ってもらうまでの敷居が高くなるのが問題。

2.を選択すると、manifestに対応していないWindows 2000で別の対策が必要になる。 Windows 2000の場合は、次のいずれかをユーザーにお願いすることになる。

  1. Microsoft.VC90.CRTのDLLをMIDITrail.exeと同一のフォルダに移動してもらう。
  2. Microsoft.VC90.CRTにパスを通してもらう。
  3. VC++ 2008 SP1 再頒布可能パッケージを適用してもら。

結論

ユーザーの導入しやすさを優先し、プライベートアセンブリを継続する。 Windows 2000ユーザーの比率は少ないと思われるし、 あえてWindows 2000を利用し続けているユーザーは、 問題に対処する技術レベルが高いと推測する(勝手な想像ですが・・・)。

2010-06-05 11:40 更新者: yknk
コメント

対策1:同梱するライブラリの配置方法を変更する

MIDITrail.exe
Microsoft.VC90.CRT/
    Microsoft.VC90.CRT.manifest
    msvcm90.dll
    msvcp90.dll
    msvcr90.dll

対策2:ビルドモジュールに埋め込まれるmanifestの指定バージョンを9.0.30729.4148にする

プロジェクトのプロパティで、プリプロセッサの定義に次の文字列を追加する。

_BIND_TO_CURRENT_VCLIBS_VERSION

対策3:マニュアルのインストール手順を修正する

Windows2000環境での対応方法を追記する。 次のいずれかを選択してもらう。

  1. Microsoft.VC90.CRTのDLLをMIDITrail.exeと同一のフォルダに移動してもらう。
  2. VC++ 2008 SP1 再頒布可能パッケージを適用してもら。
2010-06-05 15:13 更新者: yknk
  • マイルストーン(未割り当て) から Version 1.0.1 (完了済み) に更新されました
2010-06-05 15:19 更新者: yknk
  • コンポーネント(未割り当て) から MIDITrail Ver.1.0.x for Windows に更新されました
2010-06-05 16:44 更新者: yknk
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2010-06-05 16:44 に更新されました

添付ファイルリスト

添付ファイルはありません