http://www.faireal.net/ より転載。体裁の変更はtitoによる。 VC++ 2005 無印 vs SP1 メモ †2007年4月21日 せっかくランタイムがパブリックになったので、ちょっと手を出してみた。 ユーザー向けメモ、開発者向けメモ、サンプル。 ユーザー向け †要約: SP1でコンパイルしたプログラムが起動できないときは、 SP1版のランタイムを入れれば問題ない。 無印版のランタイムでは解決しない。 SP1でコンパイルしたビルドは、SP1ランタイムが入ってない環境では動作せず入ってれば動作する、 という当たり前の結論。 ただし、マニフェストが古いままSP1でコンパイルすると、SP1がない環境でも一見動作した。 これは「私の動作には無印ライブラリで十分です」と本人が言うのでOSが信じているだけ、 ライブラリの差が比較的小さいので表面上動いているだけで、 本来SP1版とリンクされるので、 SP1で変わっている関数の呼び出しがあればクラッシュすると思われる。 なお、VC 2005(無印・SP1とも)のデバッグビルドのわけの分からないエラーは、 USP10.dllの相性問題だったようだ。 USP10のむちゃなバージョン上げをしていたせいで、普通の環境では絶対起きない。 マイクロソフトのせいではない。 開発者向け †SP1と無印を共存させる場合の条件コンパイル。 正攻法としては _CRT_ASSEMBLY_VERSIONが "8.0.50727.762"ならSP1で "8.0.50608.0"なら無印。 例えば、文字列変数に格納して普通の文字列として判別しても良い。 ただ、もし _USE_RTM_VERSION が定義されていると上のバージョン文字列が上書きされてしまい 正しく判別できないようだ。 そこで、 いんちきくさいやり方だが _RPTF5のようなSP1で追加された適当なマクロを使って、 #ifndef _MSC_VER #define _MSC_VER 0 #endif #if _MSC_VER == 1200 #define COMPILER L"Visual C++ 6.0" #elif _MSC_VER == 1400 #include <crtdbg.h> #ifdef _RPTF5 #define COMPILER L"Visual C++ 2005 SP1, Version 8.0.50727.726" #else #define COMPILER L"Visual C++ 2005, Version 8.0.50727.42" #endif #else #define COMPILER L"Unknown Compiler" #endif サンプル †テストとして、ASS_Help3rを4つのフレーバーでビルドしてみました。 (Avisynthなどがないと動作しません。) VC6ビルド 2007-04-21 08:30 643,072 ASS_Help3r.exe VC8無印 2007-04-21 08:30 673,280 ASS_Help3r_vc2005_no_sp.exe VC8SP1 2007-04-21 08:30 673,792 ASS_Help3r_vc2005sp1.exe VC8SP1でマニフェストが古いままのいんちきビルド 2007-04-21 08:30 673,792 ASS_Help3r_vc2005sp1_wrong.exe 覚え書き †VC 2005 vs. 2005 SP1 を試してみようと思ったが、 テスト用のPCにウェブインストール失敗。 とりあえずISOイメージ経由に切り替え。 http://msdn.microsoft.com/vstudio/express/support/install/ MD5どころかSHA-1もどうかと言われているご時世に、 チェックサムがCRCなところがのん気で笑える。 ISOイメージからのインストールもうまく行かなかったが、 \wcu\msi31 に WindowsInstaller-KB893803-v2-x86.exe という物体を発見、 これが既存の WindowsInstaller-KB884016-v2-x86.exe とのわずかなバージョン違いで干渉してる予感。 Windows Installer 3.1をコントロールパネルから削除すると今度はVCは入った。 SDKにパス通したらプロジェクトファイルが既に読めてコンパイルが通った (デバッグビルドは変なエラーになるが、後回しでとりあえず無視)。 というわけで、後でSP1を入れて本題の「SP1のランタイム」の具合を検証してみようと。 2007-04-20: Visual C++ 2005 SP1のランタイムが純正的に配布されるようになった。 ファイル名は vcredist_x86.exeのまま 6.0.2900.2180 →8.0.50727.762になっている。 今までがちょっと変だったのだが、別に意地悪でランタイムを出していなかったわけでなく、 複雑化・肥大化した結果、思わず出来てしまった隙間のようなものでしょう。 これでエクスプレス版でもSP1適用の敷居が低くなるが、 自分だけでなく、配布相手全員にランタイムを更新してもらう必要があること、 つまり「SP1版でコンパイルしたらランタイムもSP1版が必要」という点は変わりない。 ファイル名も同じなのでMS的には完全後方互換を予定しているようだ。 マニフェストとサイドバイサイドでがちがちに固めているので新旧共存は問題ないはずだが、 最新版だけ単体であったとき旧版がなくても本当に無問題か?というのは、 よく分からない(面倒だけらとりあえず両方入れておけばいいのでは…) これだけ複雑で膨大なので仕方ないのだが、Uuid.Lib とか、予期せず互換性が取れなくなることは往々ある。 せっかくだから、この機会にエクスプレス版SP1を試してみようと思ってます。 どうせただだし、問題あったら消せばいいだけだし…。 |