Pergunta

Existe uma configuração de registro que eu posso procurar para determinar se ou não o redistribuível Visual C ++ é instalado, seja independente ou como parte do Visual Studio 2008? Eu sei que eu poderia lançar o VC ++ 2008 instalador redistribuível e deixá-lo lidar com a detecção, mas ficaria mais limpo se eu posso verificar para ele e não se preocupar lançar o instalador se o redistribuível já está no sistema.

Não é nada demais, se não houver definição para procurar, pois isso é apenas para os instaladores preliminares que temos para a nova versão do nosso software. Nós não vai precisar dele para os novos instaladores baseados no Windows Installer que estamos trabalhando no que vai substituir os antigos tecnologia e vai usar os módulos de mesclagem.

Foi útil?

Solução

Verifique o registro:

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}

Outras dicas

Eu não acho que qualquer um desses solução pode ajudar quando seu utilizando OS diferente! Por ex, MsiQueryProductState será sempre retornado -1 usando o Vista VC8.0

enquanto -1 para VC8.0 / 8.0 SP1 / 9.0 com Windows 7! Portanto, a solução GUID que a Microsoft forneceu, não trabalho em todos os casos

Então eu acho que eu sou forçado a presa com o windir% \ winsxs abordagem% e procurar

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

Para aqueles que estão à procura de todos os GUIDs, Aqui está uma lista i criado:

Visual C ++ 2005 arquivos de tempo de execução

* 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 ++ arquivos de tempo de execução 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 atualização ATL Segurança SP1 arquivos de tempo de execução

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

Visual C ++ 2008 arquivos de tempo de execução

* 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 ++ arquivos de tempo de execução 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 atualização ATL Segurança SP1 arquivos de tempo de execução

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

Últimas um para VC2005:

Visual C ++ Security Update Service Pack 1 Redistributable Package MFC de 2005

* 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 / download / details.aspx? familyid = AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

rápido e sujo:

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

LoadLibrary irá lidar busca os caminhos para você.

Parece que há outra solução proposta por um Microsoft-Developer, usando MsiQueryProductState API , infelizmente, também contando com os GUIDs.

Atualização : O código entrou no ar ontem e parece estar funcionando bem. Aqui está o que hoje vem sendo realizado: Ele está marcada para o GUID mais recente conhecida-a-mim e os path² to-onde-você-está-suposto-a-ser-instalado. Se ambos falhar, ele está instalado. Isso parece funcionar bem.

Além disso, ele é instalado com os argumentos de linha de comando "/ qb", que significa "sem supervisão, mas não invisíveis". Consulte este outro post sobre esses parâmetros.

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

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

² O caminho: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

Verificar $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_* se, por exemplo, você está verificando para o Visual Studio 2008 redistribuível.

I open-source um projeto ++ no Github Visual C que verifica a existência de VC ++ redistribuível DLLs especificamente e disponibilizado sob a licença Apache 2.0.

Tem três diferentes métodos para verificação da disponibilidade de VC ++ 9 e VC ++ 10 tempos de execução:

  1. Verifica a APIs MsiQueryProductState;
  2. Verifique o conteúdo dos WinSxS pasta para diretórios de produto de harmonização; e
  3. Verifica o diretório de trabalho atual para todas as versões locais do VC ++ 9 e VC ++ 10 tempos de execução (e inspeciona seus conteúdos.)

Edit: Aqui está uma amostra do que usá-lo realmente se parece com:

 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;

Eu licenciou a CRT-detector projeto sob Apache 2.0, tão à vontade para usá-lo em seus próprios aplicativos.

Atualizar para qualquer outra pessoa bater este problema:

1) Se você tiver Visual Studio instalado, as DLLs necessárias estarão presentes, mas o "pacote redist" não é, de modo que as chaves do Registro estão faltando. (Isto é, isto dará um falso negativo). No entanto, a instalação do redist por cima nesta situação é inofensiva.

2) Cada versão principal do redist (Qualquer combinação de VS2005 / VS2008, x86 / x64 / IA64 e service packs: SP1, a atualização de segurança ATL) tem um GUID diferente. Tome cuidado se você está esperando para implantar seu aplicativo em ambos x86 e x64 PCs.

3) Se você usar LoadLibrary ou um cheque de arquivos DLL, certifique-se de atingir a versão correta. Se você olhar para "qualquer" cópia do msvcrt80.dll (etc), então você não será capaz de dizer se ele é a versão do seu programa foi vinculado.

código do produto para "Microsoft Visual C ++ Security Update 2008 Service Pack 1 Redistributable Package MFC (x86)" é {9BE518E6-ECC6-35A9-88E4-87755C07200F}

Você pode verificar os arquivos no diretório WINDOWS \ WinSxS para ver quais versões você instalou. Muitas vezes, muitas versões podem ser instaladas ao mesmo tempo para que você pode precisar verificar as versões específicas que você tenha instalado.

Eu gostaria de ampliar a lista GUID com os seguintes valores:

32bit 30.729,17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32bit 30.729,01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64bit 30.729,17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64bit 30.729,01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}
VC ++ 2008 (SP1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
VC ++ 2008 (original)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
IA64 30.729,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 30.729,01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

Então, por favor decidir, se é uma boa idéia para verificar a presença de vcredist por GUIDs.

O caminho certo é usar o MsiQueryProductState API com o GUID das diferentes versões vcredist.

Ele funciona!

Cumprimentos.

entrada de registro encontrado para VC2008 redistribuível. Aqui está a minha solução:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top