Desenvolvedores.Net - TechBlog

Category Archives: Inno Setup/IsTool

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

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

Inno Setup – Alterando variáveis de ambiente

1
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
23 de fevereiro de 2011
Recentemente, no fórum, foi postada uma dúvida no fórum em relação a alterar as variáveis de ambiente pelo Inno Setup.Aproveitei a deixa para fazer uma postagem sobre isso.Fórum: http://techblog.desenvolvedores.net/bbpress/topic.php?id=11.

O Inno Setup pode ser baixado em http://www.jrsoftware.org/isdl.php é um ótimo gerador de instalador para suas aplicações e não deixa nada a desejar eu o uso desde sua segunda versão para instalar as minhas aplicações.

Para o artigo vou pegar como exemplo a variável Path, que foi a dúvida postada, mas isto serve para qualquer tipo de variável.

Para as versões NT/2000/XP/2003 e atuais. As variáveis de ambiente ficam na seguinte chave do registro.

Para máquina:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Para o usuário:
HKEY_CURRENT_USER\Environment

Para as versões 95/98/Me, é necessário modificar o arquivo AUTOEXEC.BAT. Mas não vamos falar sobre isso aqui.

O caminho na chave do registro para Path é um valor do tipo REG_EXPAND_SZ.
Como a documentação do Inno Setup para o Registro afirma na seção, há uma maneira de acrescentar valores a esses elementos:


Em um valor do tipo expandsz, ou multisz, você pode usar uma constante especial chamada {OldData} no parâmetro ValueData. {OldData} será substituída com os dados anteriores do valor do registro. A constante {OldData} pode ser útil se você precisar acrescentar uma string para um valor já existente, por exemplo, {OldData}, {app}. Se o valor não existe ou o valor existente não é um tipo string, a constante {OldData} não será usada.

Original:

On a string, expandsz, or multisz type value, you may use a special constant called {olddata} in this parameter. {olddata} is replaced with the previous data of the registry value. The {olddata} constant can be useful if you need to append a string to an existing value, for example, {olddata};{app}. If the value does not exist or the existing value isn’t a string type, the {olddata} constant is silently removed.

Então, para acrescentar um caminho a uma seção do Registro podemos usar:

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo";

Onde C:\foo é o nosso caminho
Mas deste modo, isso iria repetir o caminho quando você instalar uma segunda vez, o que deve ser corrigido também. No Inno podemos usar uma função em pascal que retorne se a variável Path realmente precisa ser alterada ou não, para isso iremos usar o parâmetro Check

Veja:

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"; Check: CheckKey('Path','C:\foo')

Vamos escrever a função CheckKey, esta função lê o valor do caminho original e verifica se o valor informado já está na chave do registro.

[Code]

//@param key: chave do registro a ser validada
//@param value: valor a ser procurado
function CheckKey(key:string; value: string): boolean;
var
OrigPath: string;
begin

if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
key, OrigPath)
then begin
//vai retornar true se o valor não existir
Result := True;
exit;
end;
// se existir, temos que procurar por ele na variável inteira
// A função Pos() retorna 0 se não encontrado
Result := Pos(';' + value + ';', ';' + OrigPath + ';') = 0;
end;

Código completo do script para estudo:

#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: "compiler:Languages\Portugues.isl"

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"; Check: CheckKey('Path','C:\foo')

[Code]

//@param key: chave do registro a ser validada
//@param value: valor a ser procurado
function CheckKey(key:string; value: string): boolean;
var
  OrigPath: string;
begin

  if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
    'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
    key, OrigPath)
  then begin
  //vai retornar true se o valor não existir
    Result := True;
    exit;
  end;
  // se existir, temos que procurar por ele na variável inteira
  // A função Pos() retorna 0 se não encontrado
  Result := Pos(';' + value + ';', ';' + OrigPath + ';') = 0;
end;

Chegamos ao fim do artigo. Desde modo podemos modificar as variáveis de ambiente que precisamos.
Mas isso é apenas uma pequena parte do que podemos fazer com o Inno Setup e acesso ao registro.

Uma ótima fonte de ajuda também é o FAQ do Inno http://www.jrsoftware.org/isfaq.php

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

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