ぼやきごと/2009-09-27/VC++2005SP1再頒布可能パッケージの罠 のバックアップ差分(No.3)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
#blog2navi()
*VC++2005SP1再頒布可能パッケージの罠 [#ha188909]

自作のC++/CLI製ライブラリ(ruche.aviutl.plugins.dll)が他の人のマシンで正常にロードされなかった。~
手持ちのネットブック(開発環境なし)で試してみたところ、同じようにうまくロードされなかった。

MicrosoftUpdateは一通り適用してあったので、VC++2005SP1のランタイムライブラリが入っていないだけだろうと思い、Microsoftから次のファイルをダウンロード。

-[[Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)>http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=ja]]

そしてインストールしてみたものの、症状は変わらなかった。~
その後ネットで色々調べて、開発マシンのVisual Studio 2005 SP1に同梱されている再頒布可能パッケージをインストールしたところ、正常に動作するようになった。

ここまで終えた時点で「Microsoftが配布しているパッケージには必要なDLLが入っていないのか?」と考えたが、それは間違いだった。~
入っていないのではなく、バージョンが異なっていた。

自作ライブラリのビルド時に自動生成される埋め込みmanifestファイルが要求しているバージョンは ''8.0.50727.4053'' だった。~
しかし、Microsoftが配布している再頒布可能パッケージ(VC++2005SP1用)内のランタイムライブラリのバージョンは ''8.0.50727.762'' だった。~
しかし、Microsoftが配布している前述の再頒布可能パッケージ内のランタイムライブラリのバージョンは ''8.0.50727.762'' だった。~
このためバージョンが合わず、「ファイルが見つからない」と言われてしまっていた。~
詳しくはWikipediaの[[分離アプリケーションとSide-by-Sideアセンブリ>Wikipedia:分離アプリケーションとSide-by-Sideアセンブリ]]等を参照のこと。

「では、この ''8.0.50727.4053'' というバージョンは何なのか?」と思いもう少し調べてみたところ、こいつだった。

-[[Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージ ATL のセキュリティ更新プログラム>http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=ja]]

最初に配布していた前述のパッケージにセキュリティ上の問題があったので、それを修正した最新版を2009年7月末から配布していたようだ。~
Visual Studio 2005 SP1はMicrosoftUpdateで更新できるため、開発マシンではMicrosoftUpdateを行ったタイミングで更新されていたようだ。

つまり、最新のVisual C++ 2005 SP1で開発したアプリケーションの配布時には上記のページを教えておけばOKということ。~
でもこんなことで悩まされるなら、いっそのことVC++のランタイムライブラリもMicrosoftUpdateで取り扱って欲しいと思うのは私だけだろうか…。

RIGHT:Category: [[[Visual Studio>ぼやきごと/カテゴリ/Visual Studio]]][[[プログラミング>ぼやきごと/カテゴリ/プログラミング]]] - 2009-09-27 01:52:51
----
RIGHT:&blog2trackback();
- 長文になりますが一応補足っぽいものを。余計なことかもしれませんが・・・。 -- 金の髭 &new{2009-09-27 (日) 06:30:32};
- VisualStudioを入れていないうちの環境で「プログラムの追加と削除」の表示を見ると、どうやら脆弱性のあるVC++2005SP1再頒布可能パッケージを入れていた環境では、MicrosoftUpdateによってKB973923(http://support.microsoft.com/?kbid=973923)に相当するパッチが当たるようです。これもバージョンが8.0.50727.4053なのですがセキュリティホールをふさぐだけのパッチのようで、これだけではライブラリはロードエラーになります。 -- 金の髭 &new{2009-09-27 (日) 06:31:44};
- 上の記事内でリンクが貼られているATLセキュリティ更新プログラムはKB973544(http://support.microsoft.com/?kbid=973544)に相当する完全なパッチというか「VC++2005SP1再頒布可能パッケージの最新版フルパッケージ」なので、これを入れることでやっとライブラリが揃って動作可能になる・・・ということのようです。 -- 金の髭 &new{2009-09-27 (日) 06:32:13};
- MS09-035(http://www.microsoft.com/japan/technet/security/bulletin/MS09-035.mspx)のFAQのとこにも、「自動更新で最低限の対応だけはするけど、フルパッケージは完全な新バージョン扱いになるんで、欲しいならダウンロードセンターから落としてね♪」みたいなことが書いてますね。 -- 金の髭 &new{2009-09-27 (日) 06:32:35};
- わかりづらいなぁ・・・。(^ω^#) やっぱりMicrosoftUpdateで新バージョンが出てるってこともわかるようになるとありがたいですね。 -- 金の髭 &new{2009-09-27 (日) 06:33:08};
- そんなわけで記事のとおりATLセキュリティ更新フルパッケージを入れることで、うちでも動くようになりました。ありがとうございます。しかし「プログラムの追加と削除」を見ると、表示は「Microsoft Visual C++ 2005 ATL Update kb973923 - x86 8.0.50727.4053」のままで、フルパッケージ入れる前と変わってない模様。KB番号古いままだけど、いいのだろうかこれ・・・。 -- 金の髭 &new{2009-09-27 (日) 06:33:36};
- 今回不足していたのはmsvcr80.dll,msvcm80.dll,msvcp80.dllの3つです。これらはMicrosoft.VC80.CRTというSide-by-Sideアセンブリ名で一括管理されており、一般にVC++ランタイムライブラリと呼ばれているのもこのアセンブリです。KB973923/KB973544のページのファイル情報を見ると、このアセンブリが入っていない/いることがわかります。前者は『旧バージョンの再頒布可能パッケージインストール済み環境向けのセキュリティパッチ』で、後者は『新バージョンの再頒布可能パッケージ』ということですね。『再頒布可能パッケージ version 2』みたいにパッケージ自体にも分かりやすいバージョン表記がされていればいいと思うのですが、Microsoftのポリシーがそれを許さないのでしょうか…。 -- ルーチェ &new{2009-09-27 (日) 07:49:18};

#comment(above)
#blog2navi()