トップ回答者
VC++ランタイム適用バージョンの確認について

質問
-
VC2010で開発したアプリケーションを、
お客様本番環境(OS:Windows(R) Server 2003, Standard Edition バージョン 5.2.3790 Service Pack 2 ビルド 3790)
社内本番リリース用環境(OS:Windows(R) Server 2003, Standard Edition バージョン 5.2.3790 Service Pack 2 ビルド 3790)
で動作させたのですが、社内用環境では問題なく動作しお客様環境ではWin32の例外が発生します。
エラー内容:「***.exe[2816]でハンドルされていないWin32の例外が発生しました。」
両端末とも「Microsoft Visual C++ 2010 x86 Redistributable」vcredist_x86.exe(ファイルバージョン10.0.40219.325)を
インストールしているのですが、system32のWinSxSフォルダの内容を確認したところ、
x86_Microsoft.VC80...についてのバージョンはお客様本番環境:8.0.50727.42、社内用本番環境:8.0.50727.762
x86_Microsoft.VC90...についてのバージョンはお客様本番環境、社内用本番環境ともに:9.0.21022.8
になっていました。この内容でVC++2010x86Redistributableが問題なくインストールされているか分かりますでしょうか?
また、C++2010x86Redistributableが正しく適用されているか確認できる箇所はありますでしょうか?
その他VC++のランタイム以外でアプリケーションが動作しない可能性がある設定はございますでしょうか?
お手数お掛けいたしますがご確認の程よろしくお願い致します。
- 編集済み nishimura hiroaki 2012年2月17日 4:34 文章校正
回答
-
VisualStudio2010には以下の2種類の再頒布可能パッケージ があります。
Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)
Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)開発環境がVS2010SP1、お客様環境にMicrosoft Visual C++ 2010 再頒布可能パッケージ (x86) をインストールしているという可能性はないでしょうか。
-
VC++ 2010 のランタイムは、System32 フォルダに配置されるように変更されました。ですので、確認する場合は、WinSxSフォルダではなく、System32フォルダそのものを確認してください。
ただ、どれがインストールされているか?のチェックが必要になるような状況があり得るのなら、インストーラを用意して、ランタイムについてはそのインストーラでマージモジュールを利用してインストールすることをお勧めします。
こうすれば、最悪でも自分が必要とするバージョンか、それより新しいバージョンがインストールされていることを担保できます(ユーザー自身が手動で削除するなど、悪意あるとおもれるような行為をしていても修復することが可能になります)。
ただし、「ハンドルされていない Win32 の例外」というのは、MFC, ATL, 標準C++, COMサポート などの各種例外を適切にハンドリングせず、OSに到達してしまう場合に発生します。自分自身の経験では、100%の確率で、プログラム的な対応漏れが原因で、ランタイムの不整合で発生することはありません。
また、ランタイムバージョンの不一致(必要未満のランタイムバージョンしかインストールされていない)は多くの場合、起動しません。
今回の事例は、おそらく特定の環境(客先)でのみ発生するものではなく、特定の環境(開発環境)だけ発生しないものと思われます。
エラー発生状況が特定できているのであれば、その処理を行っているどこかで、ハンドルしていない(catchしていない)例外がないか確認してみてください。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
もしかして、
「Microsoft Visual C++ 2010 x86 Redistributable」
をインストールすれば、2008,2005のランタイムもインストールされると思っていますか ?
上記のような認識であれば、それは違います。
それぞれ、ServicePack毎にランタイムのインストーラは別にあります。
vcredist_x86.exeでインストールしたのであれば、
コントロールパネルの「プログラムのアンインストール」
の中にインストールしたランタイムも出てくる筈です。補足:
異常終了の原因は、とっちゃんさんが書かれているように、ランタイムとは違う所にあるような気がします。
Sorry, I am not good at English.
すべての返信
-
VisualStudio2010には以下の2種類の再頒布可能パッケージ があります。
Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)
Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)開発環境がVS2010SP1、お客様環境にMicrosoft Visual C++ 2010 再頒布可能パッケージ (x86) をインストールしているという可能性はないでしょうか。
-
VC++ 2010 のランタイムは、System32 フォルダに配置されるように変更されました。ですので、確認する場合は、WinSxSフォルダではなく、System32フォルダそのものを確認してください。
ただ、どれがインストールされているか?のチェックが必要になるような状況があり得るのなら、インストーラを用意して、ランタイムについてはそのインストーラでマージモジュールを利用してインストールすることをお勧めします。
こうすれば、最悪でも自分が必要とするバージョンか、それより新しいバージョンがインストールされていることを担保できます(ユーザー自身が手動で削除するなど、悪意あるとおもれるような行為をしていても修復することが可能になります)。
ただし、「ハンドルされていない Win32 の例外」というのは、MFC, ATL, 標準C++, COMサポート などの各種例外を適切にハンドリングせず、OSに到達してしまう場合に発生します。自分自身の経験では、100%の確率で、プログラム的な対応漏れが原因で、ランタイムの不整合で発生することはありません。
また、ランタイムバージョンの不一致(必要未満のランタイムバージョンしかインストールされていない)は多くの場合、起動しません。
今回の事例は、おそらく特定の環境(客先)でのみ発生するものではなく、特定の環境(開発環境)だけ発生しないものと思われます。
エラー発生状況が特定できているのであれば、その処理を行っているどこかで、ハンドルしていない(catchしていない)例外がないか確認してみてください。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
もしかして、
「Microsoft Visual C++ 2010 x86 Redistributable」
をインストールすれば、2008,2005のランタイムもインストールされると思っていますか ?
上記のような認識であれば、それは違います。
それぞれ、ServicePack毎にランタイムのインストーラは別にあります。
vcredist_x86.exeでインストールしたのであれば、
コントロールパネルの「プログラムのアンインストール」
の中にインストールしたランタイムも出てくる筈です。補足:
異常終了の原因は、とっちゃんさんが書かれているように、ランタイムとは違う所にあるような気がします。
Sorry, I am not good at English.