inno setup

Durante a semana que passou estive a trabalhar com um installer chamado innosetup (http://www.jrsoftware.org/isinfo.php) usando o ide ScriptMaker (http://www.HiSoft2000.de/)
embora a introdução do xcopy deployment nos tenha facilitado imenso a vida no que diz respeito aos desenvolvimento de pacotes de instalação, quando queremos fazer coisas menos triviais como mapear drives ou criar datasources odbc a complexidade começa a aumentar.
não tenho a certeza se aquilo que fiz com o innosetup era impossivel de fazer num deployment project vstudio mas posso dizer que encontrei bastante informação e exemplos suficientes para conseguir fazer um setup que ainda há uma semana atrás me faria ganhar cabelos brancos só de pensar nele…

Requisitos

  • copiar ficheiros
  • mapear um drive
  • acrescentar dados ao ficheiro hosts e services
  • executar outra setup já existente
  • criar variaveis de ambiente
  • alterar path
  • criar datasource odbc

como disse utilizei o scriptmaker para criar o programa de instalação. embora com alguns senãos ao nivel do interface, permite uma compreensão muito rapida das funcionalidades e não nos obriga a aprender a linguagem (markups e opções) do innosetup.

Exemplos
* definir qual a lingua utiliza no setup
[Languages]
Name: "pt"; MessagesFile: "compiler:LanguagesPortuguese.isl"

* utilização de código e funções internas
[Files]
Source: {code:GetLocalizacaoMultiIni|''}; DestDir: {app}sistmulti.ini; Flags: External; Check: CopiarMultiIni('')

{code:GetLocalizacaoMultiIni|''} => permite chamar uma função definida no bloco [code], o | serve para definir diferentes parametros. nota: neste caso vai parametro ” já que sempre que definir funções sem parametros de entrada recebia um erro do compilador.
{app} => função interna que devolve a path para o directorio onde vai ser instalada a aplicação. outras funções interessantes {src}, {tmp}

* mapear um drive
para fazer coisas menos normais podemos usar uma linguagem de programação baseada em pascal. desta forma podemos por exemplo chamar dlls do windows como neste caso
Function WNetConnectionDialog(hWnd: Integer; dwType: INTEGER): INTEGER; External 'WNetConnectionDialog@mpr.dll stdcall';

* odbc
o mesmo se aplica para o odbc, podemos “simplesmente” chamar o dialogo que o windows implementa
Function SQLConfigDataSource(hwndParent: LONGINT; fRequest: LONGINT;lpszDriver: String; lpszAttributes: STRING): LONGINT; External 'SQLConfigDataSource@ODBCCP32.DLL stdcall';

* criar variaveis de ambiente
o truque aqui é que uma variavel de ambiente é uma misera entrada no registry
Root: HKCU; Subkey: Environment; ValueType: String; ValueName: DLC; ValueData: {code:GetPastaDestinoProgress|''}; Flags: UnInsDeleteValue

* criar ecrans para ler valores do utilizador
por exemplo perguntar onde estão ficheiros necessários para a instalação
aqui as coisas começam a complicar ligeiramente. para facilitar já existem algumas funções internas como TInputQueryWizardPage (que permite definir caixas de texto para input de valores), TInputDirWizardPage (que permite definir caixas de texto com um botão browse à frente para procurar um ficheiro), etc.
temos assim que primeiro definir uma variavel para essa pagina.
Page_PerguntarDadosTerminal: TInputQueryWizardPage;
criar os conteudos dessa pagina
Page_PerguntarDadosTerminal := CreateInputQueryPage(wpWelcome,
'Indique o nome do terminal', 'Nome do terminal. Este nome ficará guardado no ficheiro multi.ini',
'Para continuar, clique Next.');
Page_PerguntarDadosTerminal.Add('Nome do Terminal:', false);

e depois ler esses dados
NomeTerminal := Page_PerguntarDadosTerminal.Values[0];
temos acesso aos dados de uma pagina usando algum dos eventos predefinidos NextButtonClick, BackButtonClick

por Vitor Silva



Leave a Reply