Comment détecter VC++ 2008 redistribuable?
y a-t-il un paramètre de Registre que je peux rechercher pour déterminer si le redistribuable C++ visuel est installé, que ce soit seul 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 serait plus propre si je peux vérifier et ne pas prendre la peine de lancer l'installateur si le redistribuable est déjà sur le système.
ce n'est pas grave s'il n'y a pas de cadre pour la recherche, comme c'est juste pour l'avant-installateurs que nous avons pour la nouvelle version de notre logiciel. Nous n'en aurons pas besoin pour les nouveaux installateurs Windows basés sur L'installateur sur lesquels nous travaillons qui remplaceront les anciens installateurs technologiques et utiliseront les modules de fusion.
13 réponses
Vérifier 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}
Je ne pense pas que l'une de ces solutions peut aider lorsque vous utilisez différents OS ! Par exemple, MsiQueryProductState sera toujours retourné -1 en utilisant Vista VC8.0
alors que -1 pour VC8.0/8.0 SP1 / 9.0 avec Windows 7 ! Ainsi, la solution de guidage fournie par microsoft ne fonctionne pas dans tous les cas
donc je suppose que je suis forcé de rester avec l'approche % windir % \winsxs et la recherche de
- x86_Microsoft.VC80.CRT*
- x86_Microsoft.VC90.1519150920"
pour ceux qui sont à la recherche de toutes les GUIDs, Voici une liste que j'ai créé:
Visual C++ 2005 runtime files
* 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 runtime files""
* 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 runtime files""
* 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}
runtime Visual C++ 2008 fichiers
* 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 runtime files""
* 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 runtime files""
* 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}
dernier pour VC2005:
Visual C++ 2005 Service Pack 1 redistribuable Pack MFC Security Update
* 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 se chargera de vous chercher.
ressemble à Il ya une autre solution proposé par un développeur de Microsoft, en utilisant MSIQUERYPRODUCTSTATE API , hélas également compter sur les GUIDs.
Update : le code a été activé hier et semble fonctionner correctement. Voici ce qu'est avoir accompli: Il est vérifié pour la dernière connue à me GUID ET le path2-où-il-est supposé être installé. Si les deux échouent, il est installé. Cela semble beau travail.
de plus, il est installé avec les arguments de ligne de commande" /qb "qui signifie"sans surveillance mais pas invisible". Voir cet autre billet de blog à propos de ces params.
FWIW, GUIDs for 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
$WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*
Vérifiez $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_*
si, par exemple, vous vérifiez le redistribuable Visual Studio 2008.
je " open source un projet Visual C++ sur Github qui vérifie pour VC++ redistributable Dll et les a mis à disposition sous la licence Apache 2.0.
Il dispose de trois méthodes différentes pour vérifier la disponibilité des durées D'exécution VC++9 et VC++10:
- Checks the Msiqueryproduitstate APIs;
- inspecter le contenu du dossier WinSxS pour s'assurer que les répertoires de produits correspondent; et
- vérifie le répertoire de travail courant pour toutes les versions locales des durées D'exécution VC++9 et VC++10 (et inspecte leur contenu.)
edit: voici un échantillon de ce que l'utilisation ressemble réellement:
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-detector sous Apache 2.0, donc n'hésitez pas à l'utiliser dans vos propres applications.
mise à Jour pour quelqu'un d'autre de frapper ce problème:
1) Si vous avez Visual Studio installé, les DLLs nécessaires seront présents, mais le "paquet redist" n'est pas, de sorte que les clés de Registre sont manquantes. (c'est à dire que cela pourra donner un faux négatif). Toutefois, l'installation de la liste rouge sur le dessus dans cette situation est inoffensive.
2) chaque version majeure de la redist (N'importe quelle combinaison de VS2005 / VS2008, x86/x64 / IA64, et service packs: SP1,ATL security update) a une version différente. Faites attention si vous prévoyez de déployer votre application sur les PC x86 et x64.
3) Si vous utilisez LoadLibrary ou un contrôle pour les fichiers Dll, assurez-vous de cibler la bonne version. Si vous cherchez "n'importe quelle" copie de msvcrt80.dll, etc, alors vous ne serez pas en mesure de dire si c'est la version de votre programme associé.
Code produit pour " Microsoft Visual C++ 2008 Service Pack 1 redistribuable Package MFC Security Update (x86)" is {9BE518E6-ECC6-35A9-88E4-87755C07200F}
vous pouvez vérifier les fichiers sous 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 pourriez donc avoir besoin de vérifier les versions spécifiques que vous avez installées.
j'aimerais étendre la liste des guides 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-205DÉC0CBC2D}
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écider, si c'est une bonne idée de vérifier la présence de VCredist par GUIDs.
la manière la plus sûre est d'utiliser L'API MsiQueryProductState avec le GUID des différentes versions vcredist.
ça marche!
Cordialement.
trouvé entrée de Registre 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;
}
}