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#AW@kernel32.dll 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 .