Domanda

Esiste un'impostazione del Registro di sistema che posso cercare per determinare se il ridistribuibile di Visual C ++ è installato o meno, indipendentemente o come parte di Visual Studio 2008? So che potrei lanciare il programma di installazione ridistribuibile di VC ++ 2008 e lasciarlo gestire il rilevamento, ma sembrerebbe più pulito se posso verificarlo e non preoccuparmi di avviare il programma di installazione se il ridistribuibile è già sul sistema.

Non è un problema se non ci sono impostazioni da cercare, in quanto questo è solo per gli installatori preliminari che abbiamo per la nuova versione del nostro software. Non ne avremo bisogno per i nuovi installer basati su Windows Installer su cui stiamo lavorando che sostituiranno quelli della vecchia tecnologia e utilizzeranno i moduli di unione.

È stato utile?

Soluzione

Controlla il registro:

  

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

o

  

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

Altri suggerimenti

Non credo che nessuna di queste soluzioni possa essere d'aiuto quando usi un sistema operativo diverso! Ad esempio, MsiQueryProductState restituirà sempre -1 utilizzando Vista VC8.0

mentre -1 per VC8.0 / 8.0 SP1 / 9.0 con Windows 7! Quindi la soluzione GUID fornita da Microsoft non funziona in tutti i casi

quindi immagino di essere costretto a rimanere bloccato con l'approccio% windir% \ winsxs e cercare

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

Per coloro che sono alla ricerca di tutti i GUID, ecco un elenco che ho creato:

File di runtime di 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}

File di runtime di 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}

File di runtime dell'aggiornamento della protezione ATL di 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}

File di runtime di 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} 

File di runtime di 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}

File di runtime dell'aggiornamento della protezione ATL di 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}

L'ultima per VC2005:

Aggiornamento della sicurezza MFC del pacchetto ridistribuibile di 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

Veloce e sporco:

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

Loadlibrary gestirà la ricerca dei percorsi per te.

sembra che ci sia un'altra soluzione proposta da uno sviluppatore Microsoft, utilizzando MsiQueryProductState API , purtroppo anche facendo affidamento su i GUID.

Aggiornamento : il codice è stato pubblicato ieri e sembra funzionare correttamente. Ecco cosa si sta facendo: viene verificato il GUID più recente e il percorso² dove si suppone che debba essere installato. Se entrambi falliscono, viene installato. Questo sembra funzionare bene.

Inoltre, è installato con gli argomenti della riga di comando " / qb " che significa "incustodito ma non invisibile". Vedi questo altro post sul blog su tali parametri.

FWIW, GUID per Microsoft Visual C ++ 2008 / VC90 SP1 ridistribuibile - 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

² Il percorso: $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729 *

Cerca $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT_ * se, ad esempio, stai verificando la ridistribuibilità di Visual Studio 2008.

Ho aperto un progetto Visual C ++ su Github che verifica la presenza di DLL ridistribuibili VC ++ specificamente e reso disponibile sotto la licenza Apache 2.0.

Ha tre diversi metodi per verificare la disponibilità dei tempi di esecuzione di VC ++ 9 e VC ++ 10:

  1. Verifica le API MsiQueryProductState;
  2. Ispeziona il contenuto della cartella WinSxS per individuare le directory dei prodotti corrispondenti; e
  3. Verifica la directory di lavoro corrente per eventuali versioni locali dei tempi di esecuzione di VC ++ 9 e VC ++ 10 (e controlla il loro contenuto.)

modifica: ecco un esempio di come si presenta in realtà:

 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;

Ho concesso in licenza il progetto crt-detector sotto Apache 2.0, quindi sentiti libero di usarlo nelle tue applicazioni.

Aggiorna per chiunque abbia riscontrato questo problema:

1) Se hai installato Visual Studio, saranno presenti le DLL richieste, ma il pacchetto "quotist redist" non lo è, quindi mancano le chiavi di registro. (cioè questo darà un falso negativo). Tuttavia, installare il redist sopra le righe in questa situazione è innocuo.

2) Ogni versione principale del redist (Qualsiasi combinazione di VS2005 / VS2008, x86 / x64 / IA64 e service pack: SP1, aggiornamento di sicurezza ATL) ha un GUID diverso. Prestare attenzione se si prevede di distribuire l'applicazione su PC x86 e x64.

3) Se si utilizza LoadLibrary o un controllo per i file Dll, assicurarsi di scegliere come target la versione corretta. Se cerchi " qualsiasi " copia di msvcrt80.dll (ecc.) quindi non sarai in grado di dire se è la versione a cui era collegato il tuo programma.

Codice prodotto per " Aggiornamento ridistribuibile per la sicurezza del pacchetto ridistribuibile di Microsoft Visual C ++ 2008 Service Pack 1 (x86) " è {9BE518E6-ECC6-35A9-88E4-87755C07200F}

È possibile verificare i file nella directory WINDOWS \ WinSxS per vedere quali versioni sono state installate. Spesso è possibile installare più versioni contemporaneamente, pertanto potrebbe essere necessario controllare le versioni specifiche installate.

Vorrei estendere l'elenco GUID con i seguenti valori:

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 (originale)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
IA64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}
32 bit 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}

Quindi, per favore, decidi se è una buona idea controllare la presenza di VCredist da parte dei GUID.

Il modo più sicuro è usare l'API MsiQueryProductState con il GUID delle diverse versioni di Vcredist.

Funziona!

Saluti.

Trovata voce di registro per VC2008 ridistribuibile. Ecco la mia soluzione:

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top