Saltar al contenido

¿Cómo establecer una variable de entorno global desde el instalador de Inno Setup?

Posterior a consultar especialistas en esta materia, programadores de deferentes ramas y maestros hemos dado con la respuesta al dilema y la plasmamos en esta publicación.

Solución:

Prueba esto:

[Registry]
Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName: "VARIABLE_NAME"; 
    ValueData: "new_value"; Flags: preservestringtype

Es posible que deba agregar esto:

[Setup]
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes

Alternativamente intente:

[Run]
Filename: "appMyProg.exe"; BeforeInstall: SetEnvPath

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif

function SetEnvironmentVariable(lpName: string; lpValue: string): BOOL;
  external 'SetEnvironmentVariable#[email protected] stdcall';

procedure SetEnvPath;
begin
  if not SetEnvironmentVariable('VARIABLE_NAME', 'new_value') then
    MsgBox(SysErrorMessage(DLLGetLastError), mbError, MB_OK);
end;

Referencia: Preguntas frecuentes sobre Inno Setup: configuración de variables de entorno

Si el cambio de variable no se propaga (consulte Variable de entorno no reconocida [not available] por [Run] programas en Inno Setup)

[Run]
...; AfterInstall: RefreshEnvironment

[Code]
const
  SMTO_ABORTIFHUNG = 2;
  WM_WININICHANGE = $001A;
  WM_SETTINGCHANGE = WM_WININICHANGE;

type
  WPARAM = UINT_PTR;
  LPARAM = INT_PTR;
  LRESULT = INT_PTR;

function SendTextMessageTimeout(hWnd: HWND; Msg: UINT;
  wParam: WPARAM; lParam: PAnsiChar; fuFlags: UINT;
  uTimeout: UINT; out lpdwResult: DWORD): LRESULT;
  external '[email protected] stdcall';  

procedure RefreshEnvironment;
var
  S: AnsiString;
  MsgResult: DWORD;
begin
  S := 'Environment';
  SendTextMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    PAnsiChar(S), SMTO_ABORTIFHUNG, 5000, MsgResult);
end;

Más detalles:

Inno Setup: configuración de una variable de entorno del sistema

En sistemas operativos más modernos (en otras palabras, adecuados), como Windows 2000, XP y Windows 2003 Server, las variables de entorno se almacenan en el Registro en las siguientes key:

HKEY_LOCAL_MACHINE System CurrentControlSet Control Session Manager Environment

Las variables se agregan creando un nuevo valor bajo este key o modificando un valor si ya existe. Para eliminar una variable, simplemente elimine su valor de Registro, a menos que esté eliminando parte de un valor expandido, como PATH, en cuyo caso solo eliminará la parte que desee.

En este punto, Windows no se dará cuenta de sus cambios a menos que cierre la sesión o reinicie. Para evitar esto, SetEnv emitirá un
WM_SETTINGCHANGE a todas las ventanas del sistema. Esto permite que otras aplicaciones en ejecución, por ejemplo, Explorer.exe, sean notificadas de su cambio. Si ejecuta SetEnv desde un símbolo del sistema, esto no actualizará la variable de entorno para la ventana actual de DOS. Esto se debe principalmente al hecho de que un proceso (SetEnv) no puede cambiar el entorno de su padre (El símbolo del sistema). Sin embargo, cualquier nuevo DOS / Símbolo del sistema que abra mostrará la nueva variable / valor.

¿Qué sería de malo ejecutar dos setup.exe con el primero haciendo la configuración de las variables de entorno y el segundo haciendo las cosas necesarias para el true configuración. El primero se ejecutaría con setup.exe / VERYSILENT

Estoy haciendo para agregar una variable de entorno de todo el sistema:

[Setup]

; Tell Windows Explorer to reload the environment
ChangesEnvironment=True

[Registry]
Root: "HKLM"; Subkey: "SYSTEMCurrentControlSetControlSession ManagerEnvironment"; ValueType: string; ValueName: "EGPL_GeoLibrarian_Drive"; ValueData: "L"; Flags: createvalueifdoesntexist preservestringtype

Las soluciones en la respuesta de @ Adrian (en realidad copiadas de la respuesta de @ TLama a una pregunta similar) son correctas para muchas situaciones.

Pero no funcionará para [Run] tareas con runasoriginaluser bandera (lo que implica postinstall bandera). Es decir, la variable no se propagará a una aplicación que se ejecute con común “Ejecutar mi programa” casilla de verificación en la página “Finalizado”.

La razón es que las tareas con runasoriginaluser se ejecutan mediante un proceso principal oculto no elevado del instalador de Inno Setup. los SetEnvironmentVariable cambiará el entorno para el instalador, pero no para su proceso principal. Desafortunadamente, el proceso principal del instalador no se puede controlar (imo).

Como solución alternativa, para establecer la variable para el runasoriginaluser tareas, debe inyectar un proceso intermedio entre el proceso principal del instalador y la tarea, y hacer que el proceso intermedio establezca la variable.

Tal proceso intermedio puede fácilmente ser el cmd.exe con su set mando:

[Run]
Filename: "cmd"; Parameters: "/C set MYVAR=MyValue & ""appMyProg.exe"""; 
    Description: "Run My Program"; Flags: postinstall runhidden

los runhidden la bandera oculta el cmd.exe ventana de la consola, no la aplicación (asumiendo que es una aplicación GUI). Si es una aplicación de consola, use start para iniciarlo en su propia ventana de consola (visible).

Reseñas y valoraciones del tutorial

Acuérdate de que te permitimos valorar esta reseña .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *