Home / ぼやきごと / 2009-09-27
2009-09-27

VC++2005SP1再頒布可能パッケージの罠

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

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

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

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

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

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

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

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

Category: [Visual Studio][プログラミング] - 2009-09-27 01:52:51

  • 長文になりますが一応補足っぽいものを。余計なことかもしれませんが・・・。 -- 金の髭 2009-09-27 (日) 06:30:32
  • VisualStudioを入れていないうちの環境で「プログラムの追加と削除」の表示を見ると、どうやら脆弱性のあるVC++2005SP1再頒布可能パッケージを入れていた環境では、MicrosoftUpdateによってKB973923(http://support.microsoft.com/?kbid=973923)に相当するパッチが当たるようです。これもバージョンが8.0.50727.4053なのですがセキュリティホールをふさぐだけのパッチのようで、これだけではライブラリはロードエラーになります。 -- 金の髭 2009-09-27 (日) 06:31:44
  • 上の記事内でリンクが貼られているATLセキュリティ更新プログラムはKB973544(http://support.microsoft.com/?kbid=973544)に相当する完全なパッチというか「VC++2005SP1再頒布可能パッケージの最新版フルパッケージ」なので、これを入れることでやっとライブラリが揃って動作可能になる・・・ということのようです。 -- 金の髭 2009-09-27 (日) 06:32:13
  • MS09-035(http://www.microsoft.com/japan/technet/security/bulletin/MS09-035.mspx)のFAQのとこにも、「自動更新で最低限の対応だけはするけど、フルパッケージは完全な新バージョン扱いになるんで、欲しいならダウンロードセンターから落としてね♪」みたいなことが書いてますね。 -- 金の髭 2009-09-27 (日) 06:32:35
  • わかりづらいなぁ・・・。(^ω^#) やっぱりMicrosoftUpdateで新バージョンが出てるってこともわかるようになるとありがたいですね。 -- 金の髭 2009-09-27 (日) 06:33:08
  • そんなわけで記事のとおりATLセキュリティ更新フルパッケージを入れることで、うちでも動くようになりました。ありがとうございます。しかし「プログラムの追加と削除」を見ると、表示は「Microsoft Visual C++ 2005 ATL Update kb973923 - x86 8.0.50727.4053」のままで、フルパッケージ入れる前と変わってない模様。KB番号古いままだけど、いいのだろうかこれ・・・。 -- 金の髭 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のポリシーがそれを許さないのでしょうか…。 -- ルーチェ 2009-09-27 (日) 07:49:18