任务单 #22102

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

开放日期: 2010-06-05 10:16 最后更新: 2010-06-05 16:44

报告人:
属主:
类型:
状态:
关闭
优先:
9 - Highest
严重性:
9 - Highest
处理结果:
文件:

Details

発生条件

  • (たぶん)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.

任务单历史 (3/7 Histories)

2010-06-05 10:16 Updated by: yknk
  • New Ticket "Visual C++ランタイムライブラリが見つからず起動が失敗する" created
2010-06-05 11:10 Updated by: 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 Updated by: 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 Updated by: 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 Updated by: yknk
2010-06-05 15:19 Updated by: yknk
  • 组件 Update from (无) to MIDITrail Ver.1.0.x for Windows
2010-06-05 16:44 Updated by: yknk
  • 状态 Update from 开启 to 关闭
  • Ticket Close date is changed to 2010-06-05 16:44

Attachment File List

No attachments

编辑

Please login to add comment to this ticket » 登录名