web-dev-qa-db-ja.com

VCRedistをインストールする必要があるかどうかを検出する方法

this one とよく似た質問がありますが、答えがうまくいきません。

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

すべての小さなリリース(たとえば、9.0.30729.01と9.0.30729.17)には適切なGUIDがあるため、私が参照している(承認されたもの)の重複した質問の答えは私には機能しません。 。さらに、これではVisual Studioが検出されないため、VCRedistパッケージが既に開発者のマシンにある場合は、不必要にVCRedistパッケージをインストールすると思います。私はこれで誰かにバグを犯したくありません。確かに、すでにDevStudioをインストールしている人ではありません。

今別の答えは$WINDIR\WinSxS\x86_Microsoft.VC80.CRT_のようなWinSxsフォルダーを調べる必要があると言いますが、これは(まだ)SP1を暗示するのに役立ちません、またはこの時点で何か足りないものはありますか?内部と「外部」のバージョン番号が記載された表があるので、特定のマイナーバージョン番号を示すことができますか?

このシナリオでマイクロソフトから何も提供されていないことは信じられませんが、インターウェブをすでに非常に長い間検索していると、元の状態に戻りますSO :)

21
lImbus

Directxのインストールには、推奨されるアプローチを使用できます。常に再配布可能ファイルを実行してください。これは必須であり、すでに出荷しているので、すでにインストールされていても、実行しても問題はありません。

8
Shea

Visual Studio C++ 2010の場合 物事が少し簡単になりました

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

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

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86]インストール済み= 1(REG_DWORD)

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64]インストール済み= 1(REG_DWORD)

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

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\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-02823AD72A1B}

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}
14
Jedidja

別のソリューション があるように見えます MsiQueryProductState API を使用して、Microsoft-Developerによって提案されましたが、悲しいことにGUIDにも依存しています。

更新:コードは昨日公開され、正常に動作しているようです。これが何をしているのかです:最新の既知であるGUID ANDインストールされている場所へのパス²がインストールされているかどうかがチェックされます。両方の場合失敗し、インストールされます。これは正常に動作するようです。

さらに、「無人だが見えない」ことを意味するコマンドライン引数「/ qb」とともにインストールされます。これらのパラメータについては この他のブログ投稿 を参照してください。

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*

6
lImbus

私はオープンソース化 VC++再頒布可能DLLをチェックするGithub上のVisual C++プロジェクト を具体的に指定し、Apache 2.0ライセンスの下で利用可能にしました。

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

  1. MsiQueryProductState APIをチェックします。
  2. WinSxSフォルダーの内容を調べて、一致する製品ディレクトリを探します。そして
  3. VC++ 9およびVC++ 10ランタイムのローカルバージョンがないか、現在の作業ディレクトリをチェックします(その内容を検査します)。

実際の使用例は次のとおりです。

 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;

私は crt-detector プロジェクトをApache 2.0でライセンス供与したので、ご自分のアプリケーションで自由に使用してください。

3
Aaronontheweb