2009-04-08 11 views
20

私はthis oneと非常によく似た質問がありますが、答えは私のためには機能しません。VCRedistをインストールする必要があるかどうかを検出するにはどうすればよいですか?

ソフトウェアセットアップはVC++ 2008(SP1、正確)に依存していますので、まだインストールされていない場合はVCRedistをインストールするためのソリューションが必要です。 私はマージモジュールを使ってmsiをビルドするのが正しい方法だと理解していますが、それは私の手にはありません。

小さなリリース(例:9.0.30729.01 vs 9.0.30729.17)には適切なGUIDがあるため、私が推測できる重複した質問の回答(受け入れられたもの)は私のためには機能しません。将来のバージョンを予測します。さらに、Visual Studioが検出されず、VCRedist Packageが既に開発者マシンにインストールされている場合、VCRedist Packageを不必要にインストールすると思います。 DevStudioをインストールしている人はいません。

もう1つの答えは、$WINDIR\WinSxS\x86_Microsoft.VC80.CRT_のようにWinSxsフォルダを調べる必要があると言いますが、これは(まだ)SP1を暗示するのには役立ちませんか?内部と外部のバージョン番号のあるテーブルがあるので、特定のマイナーバージョン番号を含めることができますか?

私はこのシナリオのために、マイクロソフトが提供するものはないと信じていますが、すでにあまりにも長い間interwebsを検索することになりました「バック古き良きには、インストールのために推奨されるアプローチを取ることができるSO :)

答えて

8

を私にもたらしますすることはできませんdirectx:常に再配布可能ファイルを実行します。それは必須で、既に出荷しているので、既にインストールされていても実行中に害はありません。

+0

これが現在受け付けています。これは今私がやっていることです。もう1つは、W2K8の問題(検出の2つのケースの1つ)につながります。 – lImbus

+4

これを行う場合は、エラーコード5100(「新しいバージョンは既にインストールされています)」を受け入れて無視してください。最近PostgreSQLインストーラでこれに苦労しました。 –

+6

常にredistを実行するには多くの時間がかかります。 – sorin

6

MsiQueryProductState APIを使用してMicrosoft-Developerによって提案されたanother solutionがあり、GUIDにも依存しているようです。

更新:コードは昨日公開され、正常に動作しているようです。 beeingが行われていることは次のとおりです。最新の既知のGUIDと、インストールされていると思われるパス²がチェックされます。どちらも失敗すると、インストールされます。これはうまくいくようです。

さらに、コマンドライン引数 "/ qb"を使用してインストールされます。これは "無人だが見えない"ことを意味します。これらのパラメータについては、this other blog postを参照してください。

FWIWは、MicrosoftのVisual C++ 2008/VC90 SP1再頒布可能のGUID - のx86 9.0.30729

  • 64ビット30729.17:8220EEFE-38CD-377E-8595-13398D740ACE
  • 32ビット30729.17:9A25302D-30C0-39D9 -BD6F-21E6EC160475
  • 32ビット30729.01:6AFCA4E1-9B78-3640-8F72-A7BF33448200

パス²: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

13

Visual Studio C++ 2010の場合、things got a bit easier

Visual C++ 2005および2008再頒布可能パッケージとは異なり、Visual C++ 2010再頒布可能パッケージの存在を検出するために使用できるレジストリキーがあります。

のVisual C++ 2010再頒布可能パッケージ検出レジストリが値

のVisual C++ 2010再頒布可能パッケージ(x86)

[マイクロソフト\ VisualStudioを\ 10.0 \ VCのHKEY_LOCAL_MACHINE \ SOFTWARE \ \ VCRedist \ x86の] インストール済み= 1( REG_DWORD)

のVisual C++ 2010再頒布可能パッケージ(x64)の

[HKEY_LOCAL_MACHINE \ソフトウェア\マイクロソフト\ VisualStudioを\ 10.0 \ VC \ VCRedist \ x64の] インストール済み= 1(REG_DWORD)

のVisual C++ 2010再頒布可能パッケージ(IA64)

[マイクロソフト\ VisualStudioを\ 10.0 \ VCのHKEY_LOCAL_MACHINE \ SOFTWARE \ \ VCRedist \ IA64] インストール済み= 1(REG_DWORD)

注::64ビットOSのWow6432Nodeでチェックする必要があります。 (HKLM \ SOFTWARE \ WOW6432NODE \ Microsoftが....)

古いバージョンのように、ここでのGUID

のVisual C++ 2010再頒布可能パッケージの製品コード

  • のVisual C++ 2010再頒布可能パッケージがある場合(x86の) - {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • のVisual C++ 2010再頒布可能パッケージ(x64)の - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • のVisual C++ 2010再頒布可能パッケージ(IA64) - {C1A35166-4301-38E9-BA67-02823AD 72A1B}

のVisual C++ 2010 SP1再頒布可能パッケージ製品コード

  • のVisual C++ 2010 SP1再頒布可能パッケージ(x86) - {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • のVisual C++ 2010 SP1再頒布可能パッケージ(x64)の - {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • のVisual C++ 2010 SP1再頒布可能パッケージ(IA64) - {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}
+3

ありがとう!この部分は本当に私を助けました... 注:64ビットOSのWow6432Nodeでチェックする必要があります。 (HKLM \ Software \ Wow6432Node \ Microsoft ....) – Joe

3

私はa Visual C++ project on Github that checks for VC++ redistributable DLLsをオープンソース化し、Apache 2.0ライセンスで利用可能にしました。

それはVC++ 9とVC++ランタイム10の可用性をチェックするための3つの異なる方法があります。

  1. チェックしMsiQueryProductState APIを。
  2. 一致する製品ディレクトリのWinSxSフォルダの内容を検査します。
  3. ローカルバージョンのVC++ 9およびVC++ 10ランタイムの現在の作業ディレクトリをチェックし(その内容を検査します。私は、Apache 2.0の下でcrt-detectorプロジェクトのライセンスを取得し、その独自のアプリケーションでそれを使用すること自由に感じ

    wcout << _T("Checking for the availability of VC++ runtimes..") << endl; 
    wcout << _T("----------- Visual C++ 2008 (VC++9) -----------") << endl; 
    wcout << _T("Visual C++ 2008 (x86) ? ") << (IsVC2008Installed_x86() ? _T("true") : _T("false")) << endl; 
    wcout << _T("Visual C++ 2008 (x64) ? ") << (IsVC2008Installed_x64() ? _T("true") : _T("false")) << endl; 
    wcout << _T("Visual C++ 2008 SP1 (x86) ? ") << (IsVC2008SP1Installed_x86() ? _T("true") : _T("false")) << endl; 
    wcout << _T("Visual C++ 2008 SP1 (x64) ? ") << (IsVC2008SP1Installed_x64() ? _T("true") : _T("false")) << endl; 
    

    :)

はここのように、それは実際に見える使用して何のサンプルです。

+0

私はあなたに感謝します! –

関連する問題