Professional Documents
Culture Documents
18
Introduo
O Inno Setup um gerador de programas de instalao para Windows, gratuito e de cdigo aberto. um dos instaladores mais bem feitos e usados, concorre diretamente com muitos softwares comerciais do tipo. Voltado a desenvolvedores diversos, ele facilita a criao de um programa de instalao para suas aplicaes, com um visual moderno e clssico de instalador, se mantendo prtico e cheio de recursos. Ter um instalador prprio mal feito ou feito na correria pode ser ruim para seus programas, bom preparar uma instalao bem feita - afinal, o primeiro contato dos usurios com seu programa geralmente se d durante a instalao :) Entre vrias outras coisas, o Inno Setup permite criar chaves no registro e em arquivos INI, alm do bsico de um instalador: copiar arquivos para alguma pasta e a criao de atalhos. Ele tem vrias propriedades que podem ser configuradas, como limitar a instalao a somente administradores, registrar DLL/OCX, instalar fontes, e muito mais. Ainda cria um desinstalador, que pode remover completamente seu programa. Uma grande possibilidade que ele tem suporte a uma espcie de "programao" interna, onde voc pode personalizar o instalador usando algumas funes como se estivesse num ambiente de programao. possvel tambm chamar funes de DLLs, ou seja: as possibilidades so imensas. Ele pode ser baixado em:
http://www.jrsoftware.org/ A gerao dos instaladores com o Inno Setup se d por meio de um script. O compilador dele l o script e gera um executvel, unindo seus arquivos, as configuraes e o mdulo do instalador (um executvel pronto, que realizar a instalao baseando-se nas configuraes definidas). O resultado um nico arquivo .exe, que pode ser facilmente distribudo. O instalador dos seus programas ter esta aparncia:
A criao do script, que basicamente um arquivo de texto puro (com a extenso .iss), pode ser feita digitando-se os comandos manualmente ou ento usando o assistente de criao do Inno que gera um projeto bsico. A forma mais fcil de criar um novo instalador usar o assistente, e depois modificar o arquivo do projeto manualmente. E claro, modificar vrias vezes, compilar e testar, at ficar pronto :) O assistente dele faz o bsico, vou me concentrar em mostrar alguns pontos importantes para um bom instalador, como a criao de chaves no registro, e orientao sobre como "programar" no Inno Setup, dando exemplo de uso de uma DLL externa. O assistente do Inno exibe algumas telas, basta voc ir preenchendo com as informaes do seu programa e avanando:
Ao final, ele tem um script bsico, que voc poder modificar sem grandes dificuldades. Antes de comear, bom ter organizado e separado os arquivos do seu programa. Deixe tudo o que dever existir no sistema do usurio em uma pasta, com subpastas, se necessrio - toda a estrutura ser copiada. Separe tambm o texto da licena da aplicao, de preferncia num arquivo TXT. Iniciando o compilador do Inno Setup, escolha a opo "Create a new script using the Script Wizard". V preenchendo as informaes conforme solicitadas, e ao concluir, ter o script padro gerado. Considerando que ele um gerador de programas de instalao para um software que voc tenha criado, no haver dificuldade em passar pelo assistente. Para compilar seu projeto, tecle CTRL+F9, e para compilar e testar, F9 apenas (como no Delphi). Voc pode usar os menus ou botes da barra de ferramentas tambm, claro. O ambiente do Inno funciona como um debugger, mostrando quando algo estiver errado (inclusive indicando a linha), alm de exibir um log da instalao em andamento (enquanto voc testar o instalador a partir da interface dele). O arquivo para ser distribudo ser o setup.exe, que por padro fica na pasta "Output", onde estiver salvo o script. A estrutura bsica do script do Inno Setup esta:
[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={{4BD6DFD3-105A-4921-B253-3F15E6022B5C} AppName=My Program AppVerName=My Program 1.5 AppPublisher=My Company, Inc. AppPublisherURL=http://www.example.com/ AppSupportURL=http://www.example.com/ AppUpdatesURL=http://www.example.com/ DefaultDirName={pf}My Program DefaultGroupName=My Program OutputBaseFilename=setup Compression=lzma SolidCompression=yes [Languages] Name: "brazilianportuguese"; "compiler:LanguagesBrazilianPortuguese.isl" MessagesFile:
[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "C:Program Files (x86)Inno Setup 5ExamplesMyProg.exe"; DestDir: "{app}"; Flags: ignoreversion ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}My Name: "{commondesktop}My desktopicon Program"; Program"; Filename: "{app}MyProg.exe" Filename: "{app}MyProg.exe"; Tasks:
"{cm:LaunchProgram,My
Program}";
Veja que o arquivo tem o estilo dos arquivos INI, sendo bem fcil de editar. Algumas sees permitem vrios parmetros, neste caso eles devem ser separados por ponto-e-vrgula, alm de terem seu contedo declarado entre aspas, se tiver espaos. A seo [Setup] define informaes bsicas do programa de instalao, como o nome da aplicao, URL do produtor, pasta padro para instalao, etc. O Inno Setup usa algumas constantes de pastas prprias; voc pode ver uma relao completa na ajuda dele. Por exemplo, {pf} retorna o caminho completo da pasta "Arquivos de programas" no sistema do usurio independente do idioma do Windows ou partio em que ela esteja. Na seo [Setup], vrias coisas podem ser ativadas ou desativadas, como a compresso, a exibio de uma licena de uso, a possibilidade de proteger a instalao com uma senha, entre muitas outras. As entradas nesta seo so simples, sendo basicamente no estilo Diretiva=Opo. A seo [Languages], como o nome sugere, permite definir os idiomas da instalao. No assistente voc pode escolher vrios idiomas, ou modificar as entradas aqui, adicionando novas linhas para os idiomas desejados. Por exemplo, para manter o instalador em ingls e portugus, voc colocaria:
MessagesFile:
recomendvel que o programa seja instalado apenas por um administrador. Usurios limitados no podem gravar coisas em chaves globais do registro, nem em pastas do sistema (como a Arquivos de programas). Apesar de ser possvel o usurio gravar coisas nas suas pastas pessoais (podendo at instalar o programa nela, se as caractersticas da instalao permitir), com a vinda do Windows Vista e o XP, popular com o NTFS por padro, bom restringir a instalao aos administradores. No Windows XP com o HD formatado em FAT32, um usurio limitado at pode instalar coisas na Arquivos de programas, mesmo que no possa gravar dados em algumas chaves do registro. J com o sistema de arquivos NTFS, padro no Vista tambm, no tem como ele gravar dados na Arquivos de programas. Nas verses recentes do Inno Setup, por padro, a instalao s pode ser feita por um administrador. Se quiser permitir que usurios limitados executem seu instalador, ento adicione na seo [Setup] esta linha: PrivilegesRequired=none. Na desinstalao, limpe tudo o que o seu programa colocar, mas tome o cuidado de no apagar arquivos do usurio. O Inno Setup remove uma boa parte do que ele faz na instalao automaticamente. Mas em algumas situaes, alguns arquivos podem permanecer no HD. Tome o cuidado de remover estes arquivos (comentarei como logo mais). Em coisas exclusivas do seu programa (pastas, chaves do registro e atalhos), use um nome que provavelmente s o seu programa use, para evitar conflitos com outros programas que possam existir no sistema do usurio.
Programa
#include "meuarquivo.iss"
A extenso no precisa ser necessariamente .iss, pode ser outra se voc quiser, como .txt, por exemplo. O arquivo informado dever estar na mesma pasta do arquivo de projeto, ou ento voc pode informar o caminho completo (por exemplo, "C:Minha pastaMeu arquivo.iss"). Se o arquivo estiver na mesma pasta do compilador, voc pode utilizar assim: #include compiler:teste.iss. Alis, "compiler:" ser substitudo pelo caminho da pasta do compilador, em diversas sees.
O assistente de criao de script do Inno cria uma entrada para cada arquivo que voc adicionar, na seo [Files]. Por exemplo:
[Files] Source: Source: "C:programaPrograma.exe"; "C:programaLeiame.txt"; DestDir: DestDir: "{app}"; "{app}"; Flags: Flags: ignoreversion ignoreversion
DefaultDirName={pf}Meu programa
Para a maioria das instalaes, no necessrio alterar esse caminho. O instalador gravar no registro (na mesma chave de desinstalao) o caminho em que for instalado, e caso uma nova verso do programa for instalada, ele manter a pasta existente como padro. Ele detecta se o programa j est instalado ou no com base no valor da diretiva AppId, ID da aplicao, na seo [Setup]. Quando voc fizer uma nova verso do seu programa, que no puder ser entendida como uma atualizao da atual (ou que possa coexistir com ela no sistema), altere o valor da AppId. Mas no faa isso se voc pretende que o programa seja atualizvel, por exemplo, da verso 1.2 para 1.5. bom escolher um nome para a AppId que s o seu programa use, e seus programas diferentes tambm devero usar IDs diferentes. Uma outra recomendao minha manter o arquivo de projeto numa pasta, e dentro dessa pasta a pasta com os arquivos do programa a serem inclusos. Exemplo de estrutura:
Assim, dentro do arquivo .iss voc pode referenciar os arquivos usando caminhos relativos, como por exemplo:
Se precisar mover a pasta de lugar, leve tudo junto com ela. Dessa forma voc no precisar editar o arquivo para retirar a referncia esttica, como C:pasta, por exemplo.
[Registry] Root: HKCU; SubKey: ChaveSubchave; NomeDoValor; ValueData: DadoDoValor; ValueType: TipoDoValor; ValueName:
O parmetro Root define a chave root do registro que ser alterada. Voc deve colocar HKCU para a HKEY_CURRENT_USER, ou HKLM, para a HKEY_LOCAL_MACHINE (entre outras). No SubKey, defina o caminho desejado. Ele no precisa existir no sistema. Se no existir, ser criado automaticamente. Por exemplo, "SoftwareMinha EmpresaMeu Programa". Lembre-se de colocar textos que contenham espaos entre aspas. Em ValueType, defina o tipo do valor, que pode ser dword (inteiro), string (os mais usados), entre alguns outros. Para valores booleanos, use dword, e atribua ao valor 1 para True, ou 0 para False. Em ValueData, como era de se esperar, coloque o dado do valor. Se for uma string, prefira colocar entre aspas. Um exemplo:
Root: HKCU; SubKey: "SoftwareMinha EmpresaMeu programa"; ValueType: dword; ValueName: UsarCoresPersonalizadas; ValueData: 1;
Isso colocaria o valor 1 neste local:
HKEY_CURRENT_USER Software Minha Empresa Meu programa, valor dword "UsarCoresPersonalizadas", com o valor 1. Outro exemplo, agora com uma string, que uso num dos meus programas:
Root: HKCU; SubKey: "SoftwareMepMep Texto"; ValueType: Skin; ValueData: "{app}skins_Default Mep Texto 5.skn";
string;
ValueName:
Repare que voc pode usar constantes do Inno Setup no valor, se precisar, para usar caminhos de pastas ou arquivos que variam de sistema para sistema - como no caso, usei a {app} para retornar a pasta da aplicao, j que queria referenciar um arquivo dentro dela. Apesar de no ser necessrio seguir a ordem no script do Inno para as chaves do registro, uma organizao sempre faz bem. Por experincias prprias com ele, sugiro criar as chaves definindo que elas devero ser removidas aps a instalao, e s depois de declarar isso, colocar as entradas que gravaro os valores propriamente ditos. Por exemplo:
SoftwareEmpresa; SoftwareEmpresa;
Flags: Flags:
SoftwareEmpresaPrograma;
Seguindo a forma exemplificada nas 4 linhas mais acima, voc obtm um instalador mais "profissional". Ele cria a chave para a empresa, se ainda no existir, e configura para remov-la na desinstalao apenas se estiver vazia (com o uso da flag uninsdeletekeyifempty). Aps isso, cria a chave do programa, dentro da chave da empresa, e configura para remoo na desinstalao, mesmo se no estiver vazia (j que est removendo o programa, no teria porque manter a chave do registro dele). A flag uninsdeletekey faz com que a chave e todas as suas subchaves sejam removidas na desinstalao. Caso voc tenha vrios programas, eles nunca removero as configuraes dos outros, pois cada um ter sua prpria chave, sob o nome da chave da empresa. Ao desinstalar o ltimo programa desta empresa, que a chave da empresa ser removida. Antes disso, no, pois com o uso da flag uninsdeletekeyifempty para a chave da empresa, esta no ser excluda se ainda existirem subchaves (provavelmente de seus outros
programas). Uma dica colocar na ordem exibida. Na desinstalao, o Inno Setup executa as funes correspondentes de baixo para cima no script, as primeiras entradas sero as ltimas a serem tratadas na desinstalao. Caso voc no queira usar uma chave para a empresa (que pode ser o seu nome, o produtor do programa), pode ento usar diretamente uma para o programa, ficando assim apenas:
Root:
HKLM;
SubKey:
SoftwarePrograma;
Flags:
uninsdeletekey
[Registry] Root: HKCR; Subkey: "MyProgramFile"; Root: HKCR; ValueData: Subkey: "My ".myp"; ValueType: string; Flags: ValueName: ""; ValueData: uninsdeletevalue ValueName: ""; uninsdeletekey
Root: HKCR; Subkey: "MyProgramFileDefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}MYPROG.EXE,0" Root: HKCR; Subkey: "MyProgramFileshellopencommand"; ValueName: ""; ValueData: """{app}MYPROG.EXE"" ""%1"""
Onde: .myp
ValueType:
string;
extenso
desejada;
MyProgramFile o nome interno do tipo de arquivo, use um diferente para cada extenso; My Program File a descrio dos arquivos desse tipo, que aparecer no Windows Explorer; {app}MYPROG.EXE,0 define o cone dos arquivos, que poder estar em um executvel ou DLL (devendo ser seguido do ndice) ou indique diretamente um arquivo .ico; Tome cuidado aqui: ""{app}MYPROG.EXE"" ""%1"". desse jeito, use as aspas duplas e duplicadas, e cuidado com o espao antes do ""%1"". A string final dever ficar assim:
Como as aspas so usadas internamente pelo Inno, necessrio us-las duas vezes seguidas, "", para que sejam gravada no registro uma nica aspa. Dica: ao modificar as associaes de arquivos na instalao, inclua a diretiva ChangesAssociations=yes na seo [Setup]. Com ela, o instalador notifica o Windows para que recarregue as configuraes de associaes de arquivos no Explorer ao final da instalao. Ao associar arquivos ao seu programa, tenha em mente que o mesmo dever estar programado para abrir arquivos passados como parmetro pela linha de comando. Caso contrrio, ao dar um duplo clique num arquivo da extenso escolhida, o seu programa at ser aberto, mas sem fazer nada sem abrir o arquivo. Lembre-se que voc pode consultar a ajuda do Inno Setup (ou a ajuda on line do Mep Installer, que est em portugus) para ver as outras opes possveis.
A mensagem no StatusMsg opcional, e pode ser declarada para aparecer durante a instalao, enquanto o instalador termina. Se nada for informado, ficar a mensagem padro "Concluindo instalao". Com as flags voc pode configurar diversas coisas, como ocultar a janela do instalador ao rodar o comando, rodar o comando oculto (no faa isso para programas que exijam interao do usurio, seno o instalador vai ficar parado e o programa no seria mostrado :p), etc. So vrios os parmetros, h uma lista na ajuda que comentei, do Mep Installer:
seo [UninstallDelete] apenas arquivos que voc saiba que seu programa poder criar, e que devero ser removidos. Exemplo:
Password=teste
A tela que pede a senha para o usurio ser assim:
A senha no ser gravada no arquivo diretamente, mas sim um hash (sombra) dela. Os arquivos, o contedo do instalador em si, no estaro "protegidos": eles no so encriptados por padro.
Voc pode forar uma encriptao usando a diretiva Encryption, ativando-a com "yes" na seo [Setup]:
Password=teste Encryption=yes
Para isso, uma DLL com a funo de criptografia do Inno dever ser colocada na pasta do Inno Setup. Ele no inclui o suporte "nativo" criptografia devido a legislao de alguns pases. Basta baixar a DLL em: http://www.jrsoftware.org/isdl.php E coloc-la na pasta do Inno (normalmente Arquivos de programas Inno Setup). No se preocupe em redistribui-la com o seu programa, no ser necessrio. Com a criptografia ativada, o contedo do instalador ser codificado usando como base a senha escolhida, e ento o arquivo estar protegido (mesmo que algum consiga acesso ao pacote de dados dentro do instalador - o que no difcil, visto que o Inno Setup open source - no poder fazer nada com os arquivos, pois estaro criptografados).
CheckSerial(Serial:
String):
Boolean;
function
CheckSerial(Serial:
String):
Boolean;
Serial
= := :=
'123456'
No se esquea de ativar a tela de informaes do usurio, colocando UserInfoPage=yes, na seo [Setup]. Se voc quiser, pode implementar um pouco mais, e testar tambm o nome de usurio e a organizao preenchidos. Para isso, precisar usar variveis e a funo ExpandConstant, que expande uma constante do Inno, retornando o valor dela como string:
CheckSerial(Serial:
String):
Boolean;
org: := :=
if (usu = 'Marcos') and (org = 'Guia do Hardware') and (Serial = '123456') then Result else Result := := True False;
end;
Coloquei assim por motivos didticos, nada impede que voc simplifique a verificao do if, deixando-o apenas assim:
Result := (usu = 'Marcos') and (org = 'Guia do Hardware') and (Serial = '123456');
Uma observao importante no Inno Setup, que esta funo chamada para cada caractere que o usurio digitar. Se voc inventar algum algoritmo de verificao diablico que coma muito processamento, a digitao do serial pelo usurio ficar "lenta". Ele chama a funo ao digitar, pois libera o boto "Avanar" apenas se a informao estiver correta. Enquanto a funo CheckSerial retornar False, o boto Avanar fica desativado. Nada impede que algum "hacker" manipule o estado do boto Next do Inno Setup, usando aplicaes de terceiros, e parta para a prxima tela sem digitar o nmero serial. O recurso interessante, mas deve ser usado com cuidado. O Inno um projeto aberto, suas especificaes so claras e qualquer um munido de conhecimentos avanados pode manipular a funo CheckSerial para sempre retornar True. A recomendao seria usar um sistema de registro externo ao Inno, com um algoritmo criado por voc, e talvez usar o campo de serial apenas para a insero do serial e posterior processamento - algo que pode ser til dado o visual do instalador, ficaria mais "tradicional" solicitar o nmero serial durante a instalao. Uma proteo maior pode se dar usando a senha com criptografia ativada, como comentado mais acima - onde mesmo se o "hacker" burlar o sistema e conseguir avanar, os arquivos estaro altamente corrompidos sem a senha certa, e no serviro para nada.
function
ValidaReg(usu,
org,
serial:
String):
Boolean;
Essa flag faz que o arquivo indicado no seja copiado para a pasta da aplicao. Ele ficar numa pasta temporria que o Inno Setup cria durante a instalao, e a remove assim que a instalao concluda. Declarada a funo da DLL, voc pode us-la no cdigo da seo [Code], como se fosse uma funo nativa do Inno. No caso da verificao do nmero serial, mudaramos o cdigo para isso:
CheckSerial(Serial:
String):
Boolean;
org: := := :=
Ou seja, quem determinar o resultado (True ou False) deixa de ser um verificador diretamente nesta funo, sendo a funo ValidaReg na DLL. Aqui est um exemplo da integrao do Inno Setup com uma DLL. A criao de DLLs foge ao objetivo deste artigo, mas para que possa ser concludo, voc precisar criar uma DLL de exemplo. Em Delphi, voc poderia simplesmente criar um arquivo .dpr com este contedo, e compil-lo, que j teria a DLL que exporta a funo ValidaReg:
library uses Windows; function ValidaReg(usu, and org, serial: and String):
CheckSerial;
Boolean;
(org='Mep') := :=
(serial='123-456-789')
Dentro da DLL voc pode programar como quiser, a fica a seu critrio. A validao do nmero serial deve usar algum algoritmo criado por voc, e claro, com algum sistema gerador de seriais com base no nome de usurio que s voc possua. No se esquea que as DLLs interagem com os arquivos independentemente da linguagem em que foram criados (Delphi, C++, VB, etc), j que elas so compiladas. A integrao com DLLs do Inno Setup muito boa e estvel, e permite que ele d conta de coisas que muitos instaladores comerciais no fazem.
Concluindo
Eis um pouco do Inno Setup. Ele ainda pode ser personalizado, de vrias formas: alm do uso de DLLs, possvel adicionar pginas (telas de instalao) personalizadas, para obter dados adicionais do usurio durante a instalao. Ou voc pode ir mais longe, baixando o cdigo fonte do Inno e alterando diretamente os arquivos do instalador - o que no fcil, mas pode ser uma experincia interessante. Ele foi feito em Borland Delphi, e compilado pelo Jordan Russell no velho Delphi 2 - j que as verses antigas do Delphi geram executveis bem pequenos, perto das verses recentes ;) Se voc no gosta de manipular o script diretamente, pode experimentar o ISTool, uma interface grfica para o Inno Setup, que permite criar e modificar os arquivos .iss facilmente:
Ele e vrias outras utilidades podem ser baixados na pgina de downloads do Inno: http://www.jrsoftware.org/is3rdparty.php Bom trabalho :)