Pregunta

¿Hay alguna configuración de Registro que pueda buscar para determinar si está o no instalado el redistribuible de Visual C ++, ya sea independiente o como parte de Visual Studio 2008? Sé que podría iniciar 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 el 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 y usarán los módulos de combinación.

¿Fue útil?

Solución

Comprueba el registro:

  

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

o

  

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

Otros consejos

¡No creo que ninguna de esas soluciones pueda ayudar cuando usas un sistema operativo diferente! Por ejemplo, MsiQueryProductState siempre devolverá -1 usando Vista VC8.0

¡mientras -1 para VC8.0 / 8.0 SP1 / 9.0 con Windows 7! Por lo tanto, la solución GUID que Microsoft proporcionó no funciona en todos los casos

así que supongo que estoy obligado a seguir con el enfoque% windir% \ winsxs y buscar

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

Para aquellos que están buscando todos los GUID, aquí hay una lista que he creado:

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}

Archivos de ejecución de la actualización de seguridad ATL de 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}

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}

Archivos de ejecución de la actualización de seguridad 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}

El último para VC2005:

Actualización de seguridad de MFC del paquete redistribuible 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

Rápido y sucio:

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

Loadlibrary gestionará la búsqueda de las rutas por ti.

parece que hay otra solución propuesta por un desarrollador de Microsoft, utilizando MsiQueryProductState API , también confiando en los GUIDs.

Actualización : el código se puso en funcionamiento ayer y parece estar funcionando bien. Esto es lo que se está haciendo: se verifica el GUID más reciente conocido y la ruta & # 178; donde se supone que se debe instalar. Si ambos fallan, se instala. Esto parece funcionar bien.

Además, se instala con los argumentos de la línea de comando " / qb " lo que significa "desatendido pero no invisible". Consulte esta otra publicación del blog sobre esos parámetros.

FWIW, GUID para Microsoft Visual C ++ 2008 / VC90 SP1 Redistributable - x86 9.0.30729

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

& # 178; El camino: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

Verifique $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT_ * si, por ejemplo, está buscando el redistribuible de Visual Studio 2008.

De código abierto un proyecto de Visual C ++ en Github que busca DLL redistribuibles de VC ++ específicamente y lo puso a disposición bajo la licencia Apache 2.0.

Tiene tres métodos diferentes para verificar la disponibilidad de los tiempos de ejecución de VC ++ 9 y VC ++ 10:

  1. Comprueba las API de MsiQueryProductState;
  2. Inspeccione el contenido de la carpeta WinSxS para encontrar directorios de productos coincidentes; y
  3. Comprueba el directorio de trabajo actual en busca de versiones locales de los tiempos de ejecución de VC ++ 9 y VC ++ 10 (e inspecciona su contenido).

editar: Aquí hay una muestra de cómo se ve su uso:

 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;

Obtuve la licencia del proyecto crt-detector bajo Apache 2.0, así que siéntase libre de usarlo en sus propias aplicaciones.

Actualizar para cualquier otra persona que tenga este problema:

1) Si tiene instalado Visual Studio, las DLL necesarias estarán presentes, pero el " paquete redist " No es así, 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) Cada versión principal de redist (cualquier combinación de VS2005 / VS2008, x86 / x64 / IA64 y paquetes de servicio: SP1, actualización de seguridad ATL) tiene un GUID diferente. Tenga cuidado si espera desplegar su aplicación en PC x86 y x64.

3) Si usa LoadLibrary o una verificación de archivos Dll, asegúrese de apuntar a la versión correcta. Si busca " cualquier " Copia de msvcrt80.dll (etc.), entonces no podrá saber si es la versión a la que se vinculó su programa.

Código de producto para " Actualización de seguridad MFC del paquete redistribuible de Microsoft Visual C ++ 2008 Service Pack 1 (x86) " es {9BE518E6-ECC6-35A9-88E4-87755C07200F}

Puede buscar los archivos en el directorio WINDOWS \ WinSxS para ver qué versiones ha instalado. A menudo, se pueden instalar muchas versiones al mismo tiempo, por lo que es posible que deba verificar las versiones específicas que haya instalado.

Me gustaría ampliar la lista de GUID con los siguientes valores:

32 bits 30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32 bits 30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64 bits 30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64 bits 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}

Entonces, decida si es una buena idea verificar la presencia de VCredist por GUIDs.

La forma más segura es utilizar la API MsiQueryProductState con el GUID de las diferentes versiones de vcredist.

Funciona!

Saludos.

Se ha encontrado una 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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top