2009-04-08 8 views
20

Mam pytanie bardzo podobne do this one, ale odpowiedź nie działa dla mnie.Jak wykryć, czy muszę zainstalować VCRedist?

Oprogramowanie Utrzymuję ustawienia zależy od VC++ 2008 (SP1, właśnie), więc muszę znaleźć rozwiązanie, aby zainstalować VCRedist, jeśli jeszcze nie jest zainstalowany. Rozumiem, że prawidłowym sposobem byłoby zbudowanie msi z modułami scalającymi, ale nie jest to w moich rękach.

Odpowiedź na duplikat pytania, do którego się odnawiam (zaakceptowany), nie działa dla mnie, ponieważ każde małe wydanie (np. 9.0.30729.01 vs 9.0.30729.17) ma prawidłowe identyfikatory GUID, których nie jestem w stanie odgadnąć lub przewidzieć dla przyszłych wersji. Ponadto uważam, że nie wykryłoby to Visual Studio, a tym samym niepotrzebnie instalowało VCRedist Package, gdy jest już na maszynie programistycznej. Nie chcę nikogo za to buszować, na pewno nie kogoś, kto ma już zainstalowane DevStudio.

Kolejna odpowiedź brzmi: powinienem zajrzeć do folderu WinSxs, takiego jak $WINDIR\WinSxS\x86_Microsoft.VC80.CRT_, ale to (jeszcze) nie pomoże mi w implikowaniu SP1, czy jest coś, czego mi brakuje w tym momencie? Czy jest gdzieś stolik z wewnętrznymi i "zewnętrznymi" numerami wersji, więc mógłbym sugerować pewien niewielki numer wersji?

Nie mogę uwierzyć, że nie ma nic dostarczane przez Microsoft w tym scenariuszu, ale szukają interwebs dla już zbyt długo teraz przynosi mnie z powrotem do dobrego ol”SO :)

Odpowiedz

8

Można podjąć zalecane podejście do instalowania directx: zawsze uruchom redystrybucję. Ponieważ jest to wymagane i już je wysyłamy, nic nie szkodzi, nawet jeśli jest już zainstalowane.

+0

zaakceptował to teraz. Oto co teraz robię. Drugi prowadzi do problemów (w jednym z dwóch przypadków wykrycia) na W2K8. – lImbus

+4

Jeśli to zrobisz, pamiętaj, aby zaakceptować i zignorować kod błędu 5100 ("nowsza wersja jest już zainstalowana"). Ostatnio mieliśmy w tym problem z instalatorem PostgreSQL. –

+6

Zawsze trwająca redystka zajmuje dużo czasu. – sorin

6

wygląda na to, że jest another solution zaproponowany przez programistę Microsoft, używając MsiQueryProductState API, niestety także polegając na identyfikatorach GUID.

Aktualizacja: Kod został opublikowany wczoraj i działa prawidłowo. Oto, co się dzieje: Jest sprawdzany pod kątem najnowszego GUID-u i ścieżki ² do miejsca, w którym powinien być zainstalowany. Jeśli oba ulegną awarii, zostanie on zainstalowany. To wydaje się działać dobrze.

Dodatkowo jest instalowany z argumentami wiersza poleceń "/ qb", co oznacza "nienadzorowany, ale niewidoczny". Zobacz this other blog post o tych parametrach.

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

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

² ścieżce: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

13

Dla Visual Studio C++ 2010, things got a bit easier.

W przeciwieństwie do pakietów redystrybucyjnych Visual C++ 2005 i 2008, istnieją klucze rejestru, które można wykorzystać do wykrywania obecności pakietu redystrybucyjnego Visual C++ 2010.

Visual C++ 2010 redystrybuowalne rejestru wykrywania pakiet wartości

Visual C++ 2010 Redystrybucyjnym (x86)

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ x 86] zainstalowana = 1 (REG_DWORD)

Visual C++ 2010 Redistributable Package (x64)

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ x64] zainstalowana = 1 (REG_DWORD)

Visual C++ 2010 Redystrybucyjnym opakowań (ia64)

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ VisualStudio \ 10.0 \ VC \ VCRedist \ ia64] zainstalowana = 1 (REG_DWORD)

Uwaga: Będziesz musiał sprawdzić pod Wow6432Node w 64-bitowym systemie operacyjnym. (HKLM \ Software \ Wow6432Node \ Microsoft ....)

Jeśli podoba Ci się w starszej wersji, oto GUID

C++ 2010 redystrybucji kody wizualne produktu Pakiet

  • Visual C++ 2010 Redistributable Package (x86) - {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • Visual C++ 2010 Redistributable Package (x64) - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • Visual C++ 2010 Redistributable Package (ia64) - {C1A35166-4301-38E9-BA67-02823AD 72A1B}

Visual C++ 2010 SP1 pakietów do redystrybucji kody produktów

  • Visual C++ 2010 SP1 Redystrybucyjnym (x86) - {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • Visual C++ 2010 SP1 Pakiet redystrybucyjny (x64) - {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • Visual C++ 2010 SP1 Redistributable Package (ia64) - {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}
+3

Dzięki !, Ta część naprawdę mi pomogła ... Uwaga: Musisz sprawdzić pod Wow6432Node w 64-bitowym systemie operacyjnym. (HKLM \ Software \ Wow6432Node \ Microsoft ....) – Joe

3

Jestem autorem i udostępniłem je na licencji Apache 2.0.

ma trzy różne metody sprawdzania dostępności VC++ 9 i C++, 10 czasy pracy:

  1. sprawdza Apis MsiQueryProductState;
  2. Sprawdź zawartość folderu WinSxS, aby dopasować katalogi produktów; i
  3. Sprawdza bieżący katalog roboczy dla wszystkich lokalnych wersji środowiska wykonawczego VC++ 9 i VC++ 10 (i sprawdza ich zawartość.)

Oto próbka tego, co używając faktycznie wygląda następująco:

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; 

I licencjonowany projekt crt-detector pod Apache 2.0, więc nie krępuj się go używać w swoich aplikacjach.

+0

Kocham Cię dzięki! –