Inno Setup – Alterando variáveis de ambiente

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: https://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

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

Você vai gostar de...

Postagens populares.

1 Comment

  1. […] This post was mentioned on Twitter by Desenvolvedores Net, Desenvolvedores Net. Desenvolvedores Net said: Ola Pessoal, um artigo sobre variáveis de ambiente e inno setup http://techblog.desenvolvedores.net/?p=460 #innosetup #desenvolvedores.net […]

Deixe um comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.