web-dev-qa-db-fra.com

Comment détecter VC ++ 2008 redistribuable?

Existe-t-il un paramètre de Registre que je peux rechercher pour déterminer si le redistribuable Visual C++ est installé, qu'il soit autonome ou dans le cadre de Visual Studio 2008? Je sais que je pourrais lancer l'installateur redistribuable VC++ 2008 et le laisser gérer la détection, mais il semblerait plus propre si je peux le vérifier et ne pas déranger le lancement de l'installateur si le redistribuable est déjà sur le système.

Ce n'est pas grave s'il n'y a pas de paramètre à rechercher, car c'est uniquement pour les installateurs préliminaires que nous avons pour la nouvelle version de notre logiciel. Nous n'en aurons pas besoin pour les nouveaux installateurs basés sur Windows Installer sur lesquels nous travaillons qui remplaceront les anciens techniciens et utiliseront les modules de fusion.

31
RobH

Vérifiez le registre:

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

ou

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

16
njshaw2

Je ne pense pas que l'une de ces solutions puisse vous aider lorsque vous utilisez un système d'exploitation différent! Par exemple, MsiQueryProductState retournera toujours -1 en utilisant Vista VC8.0

tandis que -1 pour VC8.0/8.0 SP1/9.0 avec Windows 7! Ainsi, la solution GUID fournie par Microsoft, ne fonctionne pas dans tous les cas

donc je suppose que je suis obligé de m'en tenir à l'approche% windir%\winsxs et de rechercher

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

Pour ceux qui recherchent tous les GUID, voici une liste que j'ai créée:

Fichiers d'exécution 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}

Fichiers d'exécution de 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}

Fichiers d'exécution de la mise à jour de sécurité ATL Visual C++ 2005 SP1

* 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}

Fichiers d'exécution 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} 

Fichiers d'exécution de 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}

Fichiers d'exécution de la mise à jour de sécurité ATL de Visual C++ 2008 SP1

* 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

Dernier pour VC2005:

Mise à jour de sécurité MFC du package redistribuable Visual C++ 2005 Service Pack 1

* 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

Rapide et sale:

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

Loadlibrary se chargera de rechercher les chemins pour vous.

5
1800 INFORMATION

il semble qu'il y ait ne autre solution proposée par un développeur Microsoft, utilisant MsiQueryProductState API , hélas aussi en s'appuyant sur les GUID.

Mise à jour : Le code a été mis en ligne hier et semble bien fonctionner. Voici ce qui est en train d'être fait: il est vérifié pour la dernière-connue-à-moi GUID ET le chemin² vers-où-il-est-supposé-être-installé. Si les deux échoue, il est installé. Cela semble fonctionner correctement.

De plus, il est installé avec les arguments de ligne de commande "/ qb" qui signifie "sans surveillance mais pas invisible". Voir cet autre article de blog sur ces paramètres.

FWIW, GUID pour Microsoft Visual C++ 2008/VC90 SP1 redistribuable - x86 9.0.30729

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

² Le chemin: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

4
lImbus

Vérifier $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_* si, par exemple, vous recherchez la redistribution de Visual Studio 2008.

2
Gili

J'ai open-source n projet Visual C++ sur Github qui vérifie les DLL redistribuables VC++ spécifiquement et l'ai rendu disponible sous la licence Apache 2.0.

Il existe trois méthodes différentes pour vérifier la disponibilité des runtimes VC++ 9 et VC++ 10:

  1. Vérifie les API MsiQueryProductState;
  2. Inspectez le contenu du dossier WinSxS pour rechercher les répertoires de produits correspondants; et
  3. Vérifie le répertoire de travail actuel pour toutes les versions locales des runtimes VC++ 9 et VC++ 10 (et inspecte leur contenu.)

edit: Voici un exemple de son utilisation:

 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;

J'ai autorisé le projet crt-détecteur sous Apache 2.0, alors n'hésitez pas à l'utiliser dans vos propres applications.

2
Aaronontheweb

Le code produit pour "Mise à jour de sécurité MFC du package redistribuable Microsoft Visual C++ 2008 Service Pack 1 (x86)" est {9BE518E6-ECC6-35A9-88E4-87755C07200F}

1
Jeroen

Mise à jour pour toute autre personne rencontrant ce problème:

1) Si Visual Studio est installé, les DLL requises seront présentes, mais le "package redist" ne l'est pas, donc les clés de registre sont manquantes. (c'est-à-dire que cela donnera un faux négatif). Cependant, l'installation de la redistribution par-dessus dans cette situation est inoffensive.

2) Chaque version majeure de la redistribution (toute combinaison de VS2005/VS2008, x86/x64/IA64 et des Service Packs: SP1, mise à jour de sécurité ATL) a un GUID différent. Faites attention si vous prévoyez de déployer votre application sur des PC x86 et x64.

3) Si vous utilisez LoadLibrary ou une vérification des fichiers Dll, assurez-vous de cibler la bonne version. Si vous recherchez "n'importe quelle" copie de msvcrt80.dll (etc), vous ne pourrez pas dire s'il s'agit de la version à laquelle votre programme était lié.

1
Jason Williams

Je voudrais étendre la liste GUID avec les valeurs suivantes:

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

Veuillez donc décider si c'est une bonne idée de vérifier la présence de VCredist par les GUID.

0
user189393

Le moyen le plus sûr est d'utiliser l'API MsiQueryProductState avec le GUID des différentes versions de vcredist.

Ça marche!

Cordialement.

0
rumDeep

Entrée de registre trouvée pour VC2008 redistribuable. Voici ma solution:

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

Vous pouvez rechercher les fichiers dans le répertoire WINDOWS\WinSxS pour voir les versions que vous avez installées. Souvent, de nombreuses versions peuvent être installées en même temps, vous devrez donc peut-être vérifier les versions spécifiques que vous avez installées.

0
Jonathan