21

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

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

私が参照している重複した質問 (受け入れられたもの) の答えは、すべての小さなリリース (9.0.30729.01 と 9.0.30729.17 など) には適切な GUID があり、将来のバージョンを推測または予測できないため、うまくいきません。 . さらに、これは Visual Studio を検出しないため、既に開発者のマシンにある場合、VCRedist パッケージを不必要にインストールすると思います。私はこれで誰にも迷惑をかけたくありません。DevStudio を既にインストールしている人には間違いありません。

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

このシナリオのためにマイクロソフトから何も提供されていないとは信じられませんが、インターウェブをあまりにも長く検索すると、古き良きSOに戻ります:)

4

4 に答える 4

14

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}
于 2011-12-18T15:34:44.980 に答える
6

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

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

さらに、コマンド ライン引数 "/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*

于 2009-04-09T15:26:32.190 に答える
3

VC++ 再頒布可能 DLL を特にチェックする Visual C++ プロジェクトを Github でオープンソース化し、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;

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

于 2013-11-14T05:27:03.443 に答える