Desenvolvedores.Net - TechBlog

Inno Setup – Identificando framework

6
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
3 de outubro de 2012

Um amigo me perguntou como fazer para que o Inno Setup identificasse qual framework está instalado na máquina e se não tiver, como fazer o download e instalar o mesmo.

Abaixo eu montei um script que faz este processo de instalação do framework, no caso eu usei o Framework 3.5 SP 1 para identificar se o mesmo está instalado ou não.

Uma lista de como identificar quais fw´s estão instalados pode ser obtida em http://msdn.microsoft.com/en-us/kb/kbarticle.aspx?id=318785 e basta trocar a chave de registro na linha 40 do script pela versão do fw que você necessita.

RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', 'SP', regresult);

No script iremos fazer o download do pacote standalone do fw3.5sp1, que pode ser obtido em http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe ou no link http://www.microsoft.com/en-us/download/details.aspx?id=22 , para o pacote do installer.

O Inno setup não tem suporte nativo para download de arquivos, mas isso não quer dizer que não possa ser feito.

Para atribuir esta funcionalidade ao Inno iremos usar um pacote chamado “InnoTools Downloader” que pode ser baixado em http://www.sherlocksoftware.org/file.php?id=40
No tutorial eu utilizei a versão 0.3.5.

Documentação online do InnoTools Downloader http://www.sherlocksoftware.org/innotools/itdhelp/index.html.

Bom, agora vamos ao que interessa.

Crie um novo script no Inno.
Uma linha muito importante que deve ser adicionada ao script é a linha

#include ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','ScriptPath','')

No meu caso é a primeira linha do script, esta linha adiciona a DLL (itdownload.dll) ao nosso script, é ela que iremos usar para baixar o fw.

Aqui iremos usar um pouco de programação pascal, pois é preciso para fazer as chamadas e a montagem das telas do download.

Atenção aos comentários no script, tem bastante informação útil.

//incialização do setup. É sempre chamada pelo Inno ao iniciar o setup
procedure InitializeWizard();
var
    filename  : string;
    regresult : cardinal;
begin
    // verifica se o framework 3.5 sp1 está instalado.
    // mais detalhes para outros frameworks: http://msdn.microsoft.com/en-us/kb/kbarticle.aspx?id=318785
    RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', 'SP', regresult);

    //se o resultado for um. Então o SP1 está instalado
    //Este resultado é o valor da chave
    if regresult <> 1 then begin
      // definir o caminho do arquivo
      filename := expandconstant('{tmp}\fx3.5sp1.exe');

      // não está instalado. Exibir a mensagem para o usuário se deseja instalar o fw
      if MsgBox('Para continuar a instalação é necessário fazer o download do Framework 3.5 SP1. Deseja continuar?', mbInformation, mb_YesNo) = idYes then begin
          //iniciar o itd
          itd_init;

          //adiciona um arquivo na fila de downloads. (pode se adicionar quantos forem necessários)
          itd_addfile('http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe', filename);

          //aqui dizemos ao itd que é para fazer o download após o inno exibir a tela de preparação do setup
          itd_downloadafter(wpReady);
        end else begin
          // o usuário optou por não fazer o download do fw, então avisamos de onde ele pode baixar
          MsgBox('O link para download manual do framework é http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe', mbInformation, mb_Ok);
      end
    end
end;

//Este método é chamado pelo Inno ao clicar em próximo. Neste momento a interface já está criada
procedure CurStepChanged(CurStep: TSetupStep);
var
    filename  : string;
    ErrorCode: Integer;
begin

filename := expandconstant('{tmp}\fx3.5sp1.exe');

if CurStep = ssInstall then begin
    // este passo só irá acontecer após o download do arquivo.
    // para evitar erros, validamos se o arquivo foi baixado. Se não foi, continua com o setup.
    if fileExists(filename) then begin
        // foi baixado. Executar o instalador do fw.
       if not ShellExec('', filename,'', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode) then begin
          // Xi! Deu erro
         if ErrorCode <> 0 then begin
              MsgBox('Erro ao executar o arquivo ' + filename + chr(13) + SysErrorMessage(ErrorCode), mbError, mb_Ok);
         end;
       end
    end;
end;
end;

Abaixo o código completo do Script.

#include ReadReg(HKEY_LOCAL_MACHINE,'Software\Sherlock Software\InnoTools\Downloader','ScriptPath','')
#define MyAppName "Desenvolvedores"
#define MyAppVersion "1.5"
#define MyAppPublisher "desenvolvedores.net"
#define MyAppURL "http://desenvolvedores.net"
#define MyAppExeName "desenvolvedores.exe"

[Setup]
AppId={{006DC1BE-0C38-46DF-AF73-CC79E3A1E9F4}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableDirPage=yes
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: portugues; MessagesFile: C:\Program Files (x86)\Inno Setup 5\Languages\BrazilianPortuguese.isl

[Registry]

[Files]

[Run]

[Code]
//incialização do setup. É sempre chamada pelo Inno ao iniciar o setup
procedure InitializeWizard();
var
    filename  : string;
    regresult : cardinal;
begin
    // verifica se o framework 3.5 sp1 está instalado.
    // mais detalhes para outros frameworks: http://msdn.microsoft.com/en-us/kb/kbarticle.aspx?id=318785
    RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5', 'SP', regresult);

    //se o resultado for um. Então o SP1 está instalado
    //Este resultado é o valor da chave
    if regresult <> 1 then begin
      // definir o caminho do arquivo
      filename := expandconstant('{tmp}\fx3.5sp1.exe');

      // não está instalado. Exibir a mensagem para o usuário se deseja instalar o fw
      if MsgBox('Para continuar a instalação é necessário fazer o download do Framework 3.5 SP1. Deseja continuar?', mbInformation, mb_YesNo) = idYes then begin
          //iniciar o itd
          itd_init;

          //adiciona um arquivo na fila de downloads. (pode se adicionar quantos forem necessários)
          itd_addfile('http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe', filename);

          //aqui dizemos ao itd que é para fazer o download após o inno exibir a tela de preparação do setup
          itd_downloadafter(wpReady);
        end else begin
          // o usuário optou por não fazer o download do fw, então avisamos de onde ele pode baixar
          MsgBox('O link para download manual do framework é http://download.microsoft.com/download/2/0/e/20e90413-712f-438c-988e-fdaa79a8ac3d/dotnetfx35.exe', mbInformation, mb_Ok);
      end
    end
end;

//Este método é chamado pelo Inno ao clicar em próximo. Neste momento a interface já está criada
procedure CurStepChanged(CurStep: TSetupStep);
var
    filename  : string;
    ErrorCode: Integer;
begin

filename := expandconstant('{tmp}\fx3.5sp1.exe');

if CurStep = ssInstall then begin
    // este passo só irá acontecer após o download do arquivo.
    // para evitar erros, validamos se o arquivo foi baixado. Se não foi, continua com o setup.
    if fileExists(filename) then begin
        // foi baixado. Executar o instalador do fw.
       if not ShellExec('', filename,'', '', SW_SHOW, ewWaitUntilTerminated, ErrorCode) then begin
          // Xi! Deu erro.
         if ErrorCode <> 0 then begin
              MsgBox('Erro ao executar o arquivo ' + filename + chr(13) + SysErrorMessage(ErrorCode), mbError, mb_Ok);
         end;
       end
    end;
end;
end;

Dúvidas? Perguntem.


É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

Compartilhe!

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

6 Comments for this entry

  • Fabricio disse:

    Olá. Há como executar o serviço mysqld nesse código?
    Há como fazer com que inno reinicie o windows, e depois continue a instalação?

  • André Texera disse:

    Olá Marcelo,

    Atualmente já temos a versão 4.5 do net Framework. Porem notei que após a instalação da mesma não é criada uma chave no registro chamada “SOFTWARE\Microsoft\NET Framework Setup\NDP\v4.5”, por exemplo. Como faço para validar essa versão?

    Obrigado desde já

  • Rafael disse:

    Olá Marcelo, muito bom seu blog, cheio de informações…

    Cara, estou com um problema em mexer no Inno setup…

    Criei de boa o .exe e tal.. mas queria colocar algo que não possa ser utilizado em outro PC.

    O que eu queria, ou que ele excluísse (do próprio instalador, não do PC) os arquivos DLLs que eu coloqeui nele, ou deletar o próprio instalador após a instalação for feita com sucesso.

    Para evitar que possam copiar em outros PCs, pq ninguém sabe que está instalado as DLLs e sem elas o sistema não funciona… e como é algo local (sem internet) não sei como fazer tal bloqueio… coloquei o código abaixo:

    ; Script generated by the Inno Setup Script Wizard.
    ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

    [Setup]
    ; NOTE: The value of AppId uniquely identifies this application.
    ; Do not use the same AppId value in installers for other applications.
    ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
    AppId={{09F71F2C-600E-4A6E-A91D-B9B07DD64D4C}
    AppName=RDC - Read Device Configuration
    AppVersion=1.0
    ;AppVerName=RDC - Read Device Configuration 1.0
    AppPublisher=Porto Seguro
    DefaultDirName={pf}\RDC - Read Device Configuration
    DefaultGroupName=RDC - Read Device Configuration
    AllowNoIcons=no
    OutputDir=C:\Users\f2700647\Desktop
    OutputBaseFilename=instalador RDC
    Compression=lzma
    SolidCompression=yes
    UserInfoPage=yes

    [Languages]
    Name: english; MessagesFile: compiler:Default.isl
    Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl

    [Tasks]
    Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
    Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1

    [Files]
    Source: C:\Users\f2700647\Desktop\RDC.jar; DestDir: {app}; Flags: ignoreversion
    Source: C:\Users\f2700647\Desktop\rxtxParallel.dll; DestDir: {sys}; Flags: sharedfile
    Source: C:\Users\f2700647\Desktop\rxtxSerial.dll; DestDir: {sys}; Flags: sharedfile
    ; NOTE: Don't use "Flags: ignoreversion" on any shared system files

    [Icons]
    Name: {group}\RDC - Read Device Configuration; Filename: {app}\RDC.jar
    Name: {group}\{cm:UninstallProgram,RDC - Read Device Configuration}; Filename: {uninstallexe}
    Name: {commondesktop}\RDC - Read Device Configuration; Filename: {app}\RDC.jar; Tasks: desktopicon
    Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\RDC - Read Device Configuration; Filename: {app}\RDC.jar; Tasks: quicklaunchicon

    [Run]
    Filename: {app}\RDC.jar; Description: {cm:LaunchProgram,RDC - Read Device Configuration}; Flags: nowait postinstall skipifsilent

    [Code]
    function CheckSerial(Serial: String): Boolean;

    begin
    if Serial = '3007198-5' then

    Result := True

    else
    Result := False;

    end;

    procedure MyAfterInstall();
    begin

    end;

  • Claudio Hirayama disse:

    Obrigado pelo código, Marcelo! Funcionou legal e ajudou bastante aqui no trampo. Abraços!

Deixe uma resposta

O seu endereço de e-mail não será publicado.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>