visual c++ - visual - ¿Cómo detectar VC++ 2008 redistribuible?
visual c++ redistributable 2013 (13)
¡No creo que ninguna de esas soluciones pueda ayudar cuando uses un SO diferente! Por ejemplo, MsiQueryProductState siempre devolverá -1 usando Vista VC8.0
mientras que -1 para VC8.0 / 8.0 SP1 / 9.0 con Windows 7! Entonces, la solución GUID que Microsoft proporcionó, no funciona en todos los casos
así que supongo que estoy obligado a seguir el enfoque de% windir% / winsxs y buscar
- x86_Microsoft.VC80.CRT *
- x86_Microsoft.VC90.CRT *
Para aquellos que buscan todos los GUID, aquí hay una lista que creé:
Archivos de tiempo de ejecución de 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}
Archivos de tiempo de ejecución 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}
Visual C ++ 2005 SP1 ATL Security Update archivos en tiempo de ejecución
* 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}
Archivos de tiempo de ejecución de 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}
Archivos de tiempo de ejecución 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}
Visual C ++ 2008 SP1 ATL Security Update archivos en tiempo de ejecución
* 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}
¿Existe una configuración de registro que pueda buscar para determinar si está instalado o no el redistribuible de Visual C ++, ya sea independiente o como parte de Visual Studio 2008? Sé que podría lanzar el instalador redistribuible de VC ++ 2008 y dejar que maneje la detección, pero se vería más limpio si pudiera verificarlo y no molestarme en iniciar el instalador si la redistribuible ya está en el sistema.
No hay problema si no hay una configuración para buscar, ya que esto es solo para los instaladores preliminares que tenemos para la nueva versión de nuestro software. No lo necesitaremos para los nuevos instaladores basados en Windows Installer en los que estamos trabajando que reemplazarán a los antiguos de tecnología y utilizarán los módulos de fusión.
Abrí un proyecto de Visual C ++ en Github que busca específicamente las DLL redistribuibles de VC ++ y las puso a disposición bajo la licencia de Apache 2.0.
Tiene tres métodos diferentes para verificar la disponibilidad de VC ++ 9 y VC ++ 10 runtimes:
- Comprueba las API de MsiQueryProductState;
- Inspeccione el contenido de la carpeta WinSxS para encontrar directorios de productos coincidentes; y
- Comprueba el directorio de trabajo actual para cualquier versión local de los tiempos de ejecución de VC ++ 9 y VC ++ 10 (e inspecciona sus contenidos).
editar: Aquí hay una muestra de cómo se ve realmente:
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;
Autoricé el proyecto de detección de crt en Apache 2.0, así que siéntete libre de usarlo en tus propias aplicaciones.
Compruebe si $WINDIR/WinSxS/x86_Microsoft.VC90.CRT_*
si, por ejemplo, está buscando la redistribuible de Visual Studio 2008.
El último para VC2005:
Paquete redistribuible Visual C ++ 2005 Service Pack 1 Actualización de seguridad 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
El código de producto para "Microsoft Visual C ++ 2008 Service Pack 1 paquete redistribuible Actualización de seguridad MFC (x86)" es {9BE518E6-ECC6-35A9-88E4-87755C07200F}
La forma más segura es usar la API MsiQueryProductState con el GUID de las diferentes versiones de vcredist.
¡Funciona!
Saludos.
Me gustaría extender la lista de GUID con los siguientes valores:
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}
Así que, por favor, decida si es una buena idea verificar la presencia de VCredist mediante GUID.
Puede verificar los archivos en el directorio WINDOWS / WinSxS para ver qué versiones ha instalado. A menudo, se pueden instalar muchas versiones a la vez, por lo que es posible que deba verificar las versiones específicas que ha instalado.
Rápido y sucio:
if (LoadLibrary(L"msvcrt80.dll")!=NULL)
{
// it is installed
}
Loadlibrary se encargará de buscar las rutas por usted.
Se encontró la entrada de registro para VC2008 redistribuible. Aquí está mi solución:
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;
}
}
Verifica el registro:
VC ++ 2008 (sp1): HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Desinstalar / {3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
o
VC ++ 2008 (original): HKLM / SOFTWARE / Microsoft / Windows / CurrentVersion / Uninstall / {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
parece que hay otra solución propuesta por un desarrollador de Microsoft, que utiliza la API MsiQueryProductState , y también depende de los GUID.
Actualización : el código se activó ayer y parece estar funcionando bien. Esto es lo que se está haciendo: se comprueba el GUID más reciente que conozco y la ruta² hasta donde se supone que se debe instalar. Si ambos fallan, está instalado. Esto parece que funciona bien.
Además, se instala con los argumentos de línea de comandos "/ qb" que significa "desatendido pero no invisible". Vea esta otra publicación en el blog sobre esos params.
FWIW, GUID para redistribuible de Microsoft Visual C ++ 2008 / VC90 SP1 - 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
² La ruta de acceso: $WINDIR/WinSxS/x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*
Actualización para cualquier otra persona que tenga este problema:
1) Si tiene instalado Visual Studio, las DLL necesarias estarán presentes, pero el "paquete de redist" no lo está, por lo que faltan las claves de registro. (es decir, esto dará un falso negativo). Sin embargo, instalar el redist en la parte superior en esta situación es inofensivo.
2) Todas las versiones principales de la redistribución (cualquier combinación de VS2005 / VS2008, x86 / x64 / IA64 y service packs: SP1, actualización de seguridad ATL) tienen un GUID diferente. Tenga cuidado si espera implementar su aplicación en PC x86 y x64.
3) Si usa LoadLibrary o una comprobación de archivos Dll, asegúrese de orientar la versión correcta. Si busca "alguna" copia de msvcrt80.dll (etc.), entonces no podrá saber si es la versión a la que se vinculó su programa.