web-dev-qa-db-ja.com

VC ++ 2008再頒布可能パッケージを検出する方法は?

スタンドアロンまたはVisual Studio 2008の一部として、Visual C++再頒布可能パッケージがインストールされているかどうかを確認するために検索できるレジストリ設定はありますか? VC++ 2008再頒布可能インストーラーを起動して検出を処理できることはわかっていますが、それを確認できれば、再頒布可能ファイルが既にシステム上にあるのであれば、インストーラーを起動しなくてもきれいに見えます。

これは、新しいバージョンのソフトウェア用に準備している予備のインストーラーのためだけなので、検索する設定がない場合でも大きな問題ではありません。私たちが取り組んでいる新しいWindowsインストーラーベースのインストーラーは、古い技術のインストーラーを置き換え、マージモジュールを使用するため、これは必要ありません。

31
RobH

レジストリを確認します。

VC++ 2008(sp1):HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

または

VC++ 2008(オリジナル):HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

16
njshaw2

別のOSを使用している場合、これらのソリューションは役に立たないと思います! exの場合、MsiQueryProductStateはVista VC8.0を使用すると常に-1を返します

一方、Windows 7でのVC8.0/8.0 SP1/9.0の場合は-1!したがって、GUIDソリューションは、すべてのケースで機能するわけではありません

だから私は%windir%\ winsxsアプローチで立ち往生して検索することを強いられていると思います

  • x86_Microsoft.VC80.CRT *
  • x86_Microsoft.VC90.CRT *

すべてのGUIDを探している人のために、ここに私が作成したリストがあります:

Visual C++ 2005ランタイムファイル

* VC 8.0 (x86) - {A49F249F-0C91-497F-86DF-B2585E8E76B7}
* VC 8.0 (x64) - {6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}
* VC 8.0 (ia64) - {03ED71EA-F531-4927-AABD-1C31BCE8E187}

Visual C++ 2005 SP1ランタイムファイル

* VC 8.0 SP1 (x86) - {7299052B-02A4-4627-81F2-1818DA5D550D}
* VC 8.0 SP1 (x64) - {071C9B48-7C32-4621-A0AC-3F809523288F}
* VC 8.0 SP1 (ia64) - {0F8FB34E-675E-42ED-850B-29D98C2ECE08}

Visual C++ 2005 SP1 ATL Security Updateランタイムファイル

* VC 8.0 SP1 ATL Patch (x86) - {837B34E3-7C30-493C-8F6A-2B0F04E2912C}
* VC 8.0 SP1 ATL Patch (x64) - {6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}
* VC 8.0 SP1 ATL Patch (ia64) - {85025851-A784-46D8-950D-05CB3CA43A13}

Visual C++ 2008ランタイムファイル

* VC 9.0 (x86) - {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
* VC 9.0 (x64) - {350AA351-21FA-3270-8B7A-835434E766AD}
* VC 9.0 (ia64) - {2B547B43-DB50-3139-9EBE-37D419E0F5FA} 

Visual C++ 2008 SP1ランタイムファイル

* VC 9.0 SP1 (x86) - {9A25302D-30C0-39D9-BD6F-21E6EC160475}
* VC 9.0 SP1 (x64) - {8220EEFE-38CD-377E-8595-13398D740ACE}
* VC 9.0 SP1 (ia64) - {5827ECE1-AEB0-328E-B813-6FC68622C1F9}

Visual C++ 2008 SP1 ATL Security Updateランタイムファイル

* VC 9.0 SP1 ATL (x86) - {1F1C2DFC-2D24-3E06-BCB8-725134ADF989}
* VC 9.0 SP1 ATL (x64) - {4B6C7001-C7D6-3710-913E-5BC23FCE91E6}
* VC 9.0 SP1 ATL (ia64) - {977AD349-C2A8-39DD-9273-285C08987C7B}
19
user346856

VC2005の最新バージョン:

Visual C++ 2005 Service Pack 1再頒布可能パッケージMFCセキュリティアップデート

* VC 8.0 SP1 MFCLOC Patch (x86) - {710F4C1C-CC18-4C49-8CBF-51240C89A1A2}
* VC 8.0 SP1 MFCLOC Patch (x64) - {AD8A2FA1-06E7-4B0D-927D-6E54B3D31028}
* VC 8.0 SP1 MFCLOC Patch (ia64) - {C2F60BDA-462A-4A72-8E4D-CA431A56E9EA}

8.0.50727.6195

http://www.Microsoft.com/downloads/details.aspx?familyid=AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

6
kenjiuno

素早く汚い:

if (LoadLibrary(L"msvcrt80.dll")!=NULL)
{
  // it is installed
}

Loadlibraryはパスの検索を処理します。

5

別のソリューション があるように見えます 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*

4
lImbus

たとえば、Visual Studio 2008再頒布可能パッケージをチェックしている場合は、$WINDIR\WinSxS\x86_Microsoft.VC90.CRT_*をチェックします。

2
Gili

私はオープンソース化 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でライセンス供与したので、ご自分のアプリケーションで自由に使用してください。

2
Aaronontheweb

「Microsoft Visual C++ 2008 Service Pack 1再頒布可能パッケージMFCセキュリティアップデート(x86)」の製品コードは{9BE518E6-ECC6-35A9-88E4-87755C07200F}です。

1
Jeroen

更新この問題に遭遇した他の人のために:

1)Visual Studioがインストールされている場合、必要なDLLは存在しますが、「再頒布パッケージ」は存在しないため、レジストリキーがありません。 (つまり、これは偽陰性を与えます)。ただし、この状況でRedistを上からインストールしても問題はありません。

2)redistのすべてのメジャーリリース(VS2005/VS2008、x86/x64/IA64、およびサービスパックの任意の組み合わせ:SP1、ATLセキュリティ更新)には、異なるGUIDがあります。アプリケーションをx86とx64の両方のPCに展開する場合は注意してください。

3)LoadLibraryまたはDllファイルのチェックを使用する場合は、正しいバージョンを対象にしていることを確認してください。 msvcrt80.dll(など)の「任意の」コピーを探した場合、プログラムがリンクされていたバージョンであるかどうかはわかりません。

1
Jason Williams

GUID=リストを次の値で拡張します:

32ビット30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32ビット30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64ビット30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64ビット30729.01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}
VC++ 2008(sp1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
VC++ 2008(オリジナル)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
IA64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}
32ビット30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}
Visual Studio 2008 Professional SP1
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}
32ビット30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

ですから、GUIDでVCredistの存在を確認するのが良いかどうかを判断してください。

0
user189393

最も確実な方法は、さまざまなvcredistバージョンのGUIDでMsiQueryProductState APIを使用することです。

できます!

よろしく。

0
rumDeep

VC2008再頒布可能ファイルのレジストリエントリが見つかりました。これが私の解決策です:

BOOL IsVC2008RedistInstalled(LPCTSTR pLogFile)
{
    TCHAR szLogEntry[256];
    memset(szLogEntry, '0', sizeof(szLogEntry));
    HKEY hKey;
    LONG lErr;

    TCHAR csid[256];
    _stprintf( csid, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9A25302D-30C0-39D9-BD6F-21E6EC160475}"));
    lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csid, 0, KEY_QUERY_VALUE, &hKey);
    if (lErr == ERROR_SUCCESS)
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was installed before.\n"));
    toFile(pLogFile, szLogEntry);
    return TRUE;
    }
    else
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was not installed before. %ld\n"), lErr);
    toFile(pLogFile, szLogEntry);
    return FALSE;
    }
}
0
jcai

WINDOWS\WinSxSディレクトリの下のファイルをチェックして、インストールされているバージョンを確認できます。多くの場合、一度に多くのバージョンをインストールできるため、インストールした特定のバージョンを確認する必要がある場合があります。

0
Jonathan