2014-12-20 29 views
5

Używam Inno Setup znajdujący się tutaj http://www.jrsoftware.org/Inno Setup for Visual C++ Redistributable Package for Visual Studio 2013

Jestem również za pomocą modułowej InnoSetup Zależność Instalator się tutaj http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup

Mam projekt, który wymaga Visual C++ Pakiet redystrybucyjny dla Visual Studio 2013 znajduje się tutaj. http://www.microsoft.com/en-us/download/details.aspx?id=40784

Próbuję zmodyfikować plik produktu z instalatora modułowej Inno Seup Dependency. Skopiowałem i zmodyfikowałem plik z vcredist2010.iss do vcredist2013.iss, ale problem polega na tym, że za każdym razem, gdy instaluje się, ponownie pobiera czas wykonywania C++ 2013. Nie sądzę, że wykrywa instalację, więc za każdym razem jest ona ponownie instalowana.

Oto kod obecnie mam ..

// requires Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2, Windows XP Service Pack 3 
// requires Windows Installer 3.1 or later (??) 
// requires Internet Explorer 5.01 or later (??) 
// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 

[CustomMessages] 
vcredist2013_title=Visual C++ 2013 Redistributable 

en.vcredist2013_size=6.2 MB 
de.vcredist2013_size=6,2 MB 

en.vcredist2013_size_x64=6.9 MB 
de.vcredist2013_size_x64=6,9 MB 

;http://www.microsoft.com/globaldev/reference/lcid-all.mspx 
en.vcredist2013_lcid='' 
de.vcredist2013_lcid='/lcid 1031 ' 

[Code] 
const 
    vcredist2013_url = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe'; 
    vcredist2013_url_x64 = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe'; 


procedure vcredist2013(); 
var 
    version: cardinal; 
begin 
    RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\VisualStudio\12.0\VC\VCRedist\' + GetString('x86', 'x64',''), 'Installed', version); 

    if (version <> 1) then 
    AddProduct('vcredist2013' + GetArchitectureString() + '.exe', 
      CustomMessage('vcredist2013_lcid') + '/passive /norestart', 
      CustomMessage('vcredist2013_title'), 
     CustomMessage('vcredist2013_size' + GetArchitectureString()), 
      GetString(vcredist2013_url, vcredist2013_url_x64,''),false, false); 
end; 

Czy ktoś ma lepszy sposób to zrobić?

Dzięki.

Aktualizacja

Oto najnowsza wersja.

// requires Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2, Windows XP Service Pack 3 
// requires Windows Installer 3.1 or later (??) 
// requires Internet Explorer 5.01 or later (??) 
// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 
// Thank you (Martyn) https://allthingsconfigmgr.wordpress.com/2013/12/17/visual-c-redistributables-made-simple/ 
// http://stackoverflow.com/questions/27582762/inno-setup-for-visual-c-redistributable-package-for-visual-studio-2013 
// http://stackoverflow.com/questions/11137424/how-to-make-vcredist-x86-reinstall-only-if-not-yet-installed 

[CustomMessages] 
vcredist2013_title=Visual C++ 2013 Redistribute (32bit) 
vcredist2013_title_x64=Visual C++ 2013 Redistribute (64bit) 

en.vcredist2013_size=6.2 MB 
de.vcredist2013_size=6,2 MB 

en.vcredist2013_size_x64=6.9 MB 
de.vcredist2013_size_x64=6,9 MB 

;http://www.microsoft.com/globaldev/reference/lcid-all.mspx 
en.vcredist2013_lcid='' 
de.vcredist2013_lcid='/lcid 1031 ' 

[Code] 
#IFDEF UNICODE 
    #DEFINE AW "W" 
#ELSE 
    #DEFINE AW "A" 
#ENDIF 
type 
    INSTALLSTATE = Longint; 
const 
    INSTALLSTATE_INVALIDARG = -2; // An invalid parameter was passed to the function. 
    INSTALLSTATE_UNKNOWN = -1;  // The product is neither advertised or installed. 
    INSTALLSTATE_ADVERTISED = 1; // The product is advertised but not installed. 
    INSTALLSTATE_ABSENT = 2;  // The product is installed for a different user. 
    INSTALLSTATE_DEFAULT = 5;  // The product is installed for the current user. 

    //DOWNLOADS FOR VISUAL C++ 2013 
    VC_REDIST2013_URL = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe'; 
    VC_REDIST2013_URL_x64 = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe'; 

    //OPTIONS 
    VC_2013_REDIST = '{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}'; //Microsoft.VS.VC_RuntimeMinimumVSU_x86,v12 
    VC_2013_REDIST_x64 = '{A749D8E6-B613-3BE3-8F5F-045C84EBA29B}'; //Microsoft.VS.VC_RuntimeMinimumVSU_amd64,v12 

    function MsiQueryProductState(szProduct: String): INSTALLSTATE; 
    external 'MsiQueryProductState{#AW}@msi.dll stdcall'; 

function VCVersionInstalled(const ProductID: String): Boolean; 
begin 
    Result := MsiQueryProductState(ProductID) = INSTALLSTATE_DEFAULT; 
end; 

procedure vcredist2013(); 
var 
    target_x86_Only: Boolean; 
    target_x64_Only: Boolean; 
    target_x64x86_Either: Boolean; 
begin 
    //OPTION SETTINGS ONE TRUE ONLY 
    target_x86_Only := True; 
    target_x64_Only := False; 
    target_x64x86_Either := False; 
    //END OPTION SETTINGS 


    //Will Install 32 bit only. 
    if (target_x86_only = True) then begin 
     if NOT VCVersionInstalled(VC_2013_REDIST) then 
      AddProduct('vcredist_x86.exe', 
       CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
       CustomMessage('vcredist2013_title'), 
       CustomMessage('vcredist2013_size'), 
       VC_REDIST2013_URL, 
       false, false); 
    end;  

    //Will attempt to install 64 bit only 
    if (target_x64_Only) then begin 
     if (IsX64) then begin 
      if NOT VCVersionInstalled(VC_2013_REDIST_x64) then 
       AddProduct('vcredist_x64.exe', 
        CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
        CustomMessage('vcredist2013_title_x64'), 
        CustomMessage('vcredist2013_size_x64'), 
        VC_REDIST2013_URL_x64, 
        false, false); 
      end else begin 
      MsgBox('Sorry Cant install x64 application on x86 machine.', mbInformation, MB_OK); 
      end; 
    end; 

    //Will attempt to install x64 and if it's not available it will install the x86 version 
    if (target_x64x86_Either) then begin 
     if (IsX64) then begin 
      if NOT VCVersionInstalled(VC_2013_REDIST_x64) then 
       AddProduct('vcredist_x64.exe', 
        CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
        CustomMessage('vcredist2013_title_x64'), 
        CustomMessage('vcredist2013_size_x64'), 
        VC_REDIST2013_URL_x64, 
        false, false); 
      end else begin 
       if NOT VCVersionInstalled(VC_2013_REDIST) then 
       AddProduct('vcredist_x86.exe', 
       CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
       CustomMessage('vcredist2013_title'), 
       CustomMessage('vcredist2013_size'), 
       VC_REDIST2013_URL, 
        false, false); 
      end; 
    end; 
end; 
+1

Czy na pewno szukasz właściwego klucza rejestru? * VisualStudio \ 12.0 \ VC \ VCRedist \ *. Czy to jest klucz, który wskazywałby, że rok 2013 został zainstalowany? Jeśli nie, to zostanie ona ponownie zainstalowana za każdym razem, ponieważ sprawdzasz wersję z niewłaściwego klucza. –

+0

Otwieranie regedit nie wygląda na to, że znajduje klucz ... Szukałem sposobu na jego wykrycie. Dziwne jest to, że wersja 2010 wydaje się działać poprawnie .... z tego, co mogę powiedzieć .. A może Vista i XP można wykryć w ten sposób, ale nie Windows 7 i wyżej? –

+0

Może powinno być pytanie, jak wykryć, czy Redystrybucja Visual C++ została zainstalowana? http://www.eatoncode.com/shareit/2014-12-20_1216.png –

Odpowiedz

3

@TLama Dzięki za pomoc w tej sprawie ...

Oto moja ostateczna wersja .....

// requires Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003, Windows Server 2008 R2 SP1, Windows Server 2008 Service Pack 2, Windows Server 2012, Windows Server 2012 R2, Windows Vista Service Pack 2, Windows XP Service Pack 3 
// requires Windows Installer 3.1 or later (??) 
// requires Internet Explorer 5.01 or later (??) 
// http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992 
// Thank you (Martyn) https://allthingsconfigmgr.wordpress.com/2013/12/17/visual-c-redistributables-made-simple/ 
// http://stackoverflow.com/questions/27582762/inno-setup-for-visual-c-redistributable-package-for-visual-studio-2013 
// http://stackoverflow.com/questions/11137424/how-to-make-vcredist-x86-reinstall-only-if-not-yet-installed 

[CustomMessages] 
vcredist2013_title=Visual C++ 2013 Redistribute (32bit) 
vcredist2013_title_x64=Visual C++ 2013 Redistribute (64bit) 

en.vcredist2013_size=6.2 MB 
de.vcredist2013_size=6,2 MB 

en.vcredist2013_size_x64=6.9 MB 
de.vcredist2013_size_x64=6,9 MB 

;http://www.microsoft.com/globaldev/reference/lcid-all.mspx 
en.vcredist2013_lcid='' 
de.vcredist2013_lcid='/lcid 1031 ' 

[Code] 
#IFDEF UNICODE 
    #DEFINE AW "W" 
#ELSE 
    #DEFINE AW "A" 
#ENDIF 
type 
    INSTALLSTATE = Longint; 
const 
    INSTALLSTATE_INVALIDARG = -2; // An invalid parameter was passed to the function. 
    INSTALLSTATE_UNKNOWN = -1;  // The product is neither advertised or installed. 
    INSTALLSTATE_ADVERTISED = 1; // The product is advertised but not installed. 
    INSTALLSTATE_ABSENT = 2;  // The product is installed for a different user. 
    INSTALLSTATE_DEFAULT = 5;  // The product is installed for the current user. 

    //DOWNLOADS FOR VISUAL C++ 2013 
    VC_REDIST2013_URL = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe'; 
    VC_REDIST2013_URL_x64 = 'http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe'; 

    //OPTIONS 
    VC_2013_REDIST = '{13A4EE12-23EA-3371-91EE-EFB36DDFFF3E}'; //Microsoft.VS.VC_RuntimeMinimumVSU_x86,v12 
    VC_2013_REDIST_x64 = '{A749D8E6-B613-3BE3-8F5F-045C84EBA29B}'; //Microsoft.VS.VC_RuntimeMinimumVSU_amd64,v12 

    function MsiQueryProductState(szProduct: String): INSTALLSTATE; 
    external 'MsiQueryProductState{#AW}@msi.dll stdcall'; 

function VCVersionInstalled(const ProductID: String): Boolean; 
begin 
    Result := MsiQueryProductState(ProductID) = INSTALLSTATE_DEFAULT; 
end; 

procedure vcredist2013(); 
var 
    target_x86_Only: Boolean; 
    target_x64_Only: Boolean; 
    target_x64x86_Either: Boolean; 
begin 
    //OPTION SETTINGS ONE TRUE ONLY 
    target_x86_Only := True; 
    target_x64_Only := False; 
    target_x64x86_Either := False; 
    //END OPTION SETTINGS 


    //Will Install 32 bit only. 
    if (target_x86_only = True) then begin 
     if NOT VCVersionInstalled(VC_2013_REDIST) then 
      AddProduct('vcredist_x86.exe', 
       CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
       CustomMessage('vcredist2013_title'), 
       CustomMessage('vcredist2013_size'), 
       VC_REDIST2013_URL, 
       false, false); 
    end;  

    //Will attempt to install 64 bit only 
    if (target_x64_Only) then begin 
     if (IsX64) then begin 
      if NOT VCVersionInstalled(VC_2013_REDIST_x64) then 
       AddProduct('vcredist_x64.exe', 
        CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
        CustomMessage('vcredist2013_title_x64'), 
        CustomMessage('vcredist2013_size_x64'), 
        VC_REDIST2013_URL_x64, 
        false, false); 
      end else begin 
      MsgBox('Sorry Cant install x64 application on x86 machine.', mbInformation, MB_OK); 
      end; 
    end; 

    //Will attempt to install x64 and if it's not available it will install the x86 version 
    if (target_x64x86_Either) then begin 
     if (IsX64) then begin 
      if NOT VCVersionInstalled(VC_2013_REDIST_x64) then 
       AddProduct('vcredist_x64.exe', 
        CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
        CustomMessage('vcredist2013_title_x64'), 
        CustomMessage('vcredist2013_size_x64'), 
        VC_REDIST2013_URL_x64, 
        false, false); 
      end else begin 
       if NOT VCVersionInstalled(VC_2013_REDIST) then 
       AddProduct('vcredist_x86.exe', 
       CustomMessage('vcredist2013_lcid') + '/install /quiet /norestart', 
       CustomMessage('vcredist2013_title'), 
       CustomMessage('vcredist2013_size'), 
       VC_REDIST2013_URL, 
        false, false); 
      end; 
    end; 
end; 

Nadzieje to pomaga kogoś innego.

+4

Autor modułowego InnoSetup Dependency Installer (stfx) zaktualizował swoją kolekcję, aby zawrzeć ten kod powyżej z nieco większą poprawnością - http://www.codeproject.com/Articles/20868/NET-Framework-Installer-for-InnoSetup Pobierz tam zaktualizowaną wersję. –