Question

Existe-t-il un paramètre de Registre que je puisse rechercher pour déterminer si le redistribuable Visual C ++ est installé ou non, qu'il soit autonome ou intégré à Visual Studio 2008? Je sais que je pourrais lancer le programme d’installation redistribuable VC ++ 2008 et le laisser gérer la détection, mais le résultat serait meilleur si je pouvais le vérifier et que le lancement du programme d’installation ne l’ennuie pas si le fichier redistribuable est déjà présent sur le système.

Ce n’est pas grave s’il n’y a pas de paramètre à rechercher, c’est juste 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 Windows Installer sur lesquels nous travaillons, qui remplaceront les anciens techniciens et utiliseront les modules de fusion.

Était-ce utile?

La solution

Vérifiez le registre:

  

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

ou

  

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

Autres conseils

Je pense qu'aucune de ces solutions ne peut vous aider si vous utilisez un système d'exploitation différent! Par exemple, MsiQueryProductState retournera toujours -1 avec Vista VC8.0

while -1 pour VC8.0 / 8.0 SP1 / 9.0 avec Windows 7! La solution GUID fournie par Microsoft ne fonctionne donc pas dans tous les cas.

donc je suppose que je suis obligé de rester avec 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 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 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 pour 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}

Dernière version pour VC2005:

Mise à jour de sécurité MFC pour le package redistribuable de 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

Rapide et sale:

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

Loadlibrary gérera la recherche des chemins pour vous.

semble ressembler à une autre solution proposée par un développeur Microsoft, à l'aide de API MsiQueryProductState , en s'appuyant également sur les GUID.

Mise à jour : le code a été mis en ligne hier et semble fonctionner correctement. Voici ce qui est en cours de réalisation: le dernier GUID connu et le chemin d'accès à l'emplacement où il est supposé être installé sont vérifiés. Si les deux échouent, il est installé. Cela semble bien fonctionner.

En outre, il est installé avec les arguments de la ligne de commande "/ qb". ce qui signifie "sans surveillance mais pas invisible". Consultez cet autre article de blog sur ces paramètres.

FWIW, GUID pour Microsoft Visual C ++ 2008 / VC90 SP1 redistribuable - x 86 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 *

Recherchez $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT _ * si, par exemple, vous recherchez le redistribuable de Visual Studio 2008.

J'ai ouvert un projet Visual C ++ sur Github qui vérifie la présence de DLL redistribuables VC ++ . spécifiquement et mis à disposition sous licence Apache 2.0.

Il existe trois méthodes différentes pour vérifier la disponibilité des environnements d'exécution 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. Recherche dans le répertoire de travail actuel toutes les versions locales des environnements d'exécution VC ++ 9 et VC ++ 10 (et contrôle 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 obtenu une licence pour le projet crt-détecteur sous Apache. 2.0, alors n'hésitez pas à l'utiliser dans vos propres applications.

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

1) Si Visual Studio est installé sur votre ordinateur, les DLL requises seront présentes, mais le "package de redistribution" " n'est pas, donc les clés de registre sont manquantes. (c’est-à-dire que cela donnera un faux négatif). Cependant, installer le redistribut par dessus dans cette situation est sans danger.

2) Chaque version majeure de la nouvelle liste (Toute combinaison de VS2005 / VS2008, x86 / x64 / IA64 et de service packs: SP1, mise à jour de sécurité ATL) possède un GUID différent. Faites attention si vous envisagez de déployer votre application sur des PC x86 et x64.

3) Si vous utilisez LoadLibrary ou recherchez les fichiers Dll, assurez-vous de cibler la version appropriée. Si vous recherchez " any " copie de msvcrt80.dll (etc), vous ne pourrez pas dire si c’est la version à laquelle votre programme était lié.

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

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 peut-être vérifier les versions spécifiques que vous avez installées.

J'aimerais étendre la liste des GUID avec les valeurs suivantes:

32bit 30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32bit 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}
32bit 30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}
Visual Studio 2008 Professional SP1
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}
32bit 30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

Alors, s'il vous plaît, décidez s'il est judicieux de vérifier la présence de VCredist à l'aide de GUID.

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

Cela fonctionne!

Cordialement.

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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top