Instalador de depuración de Inno Setup que reaparece
Como se puede ver en esta pregunta, comenzamos una nueva instancia de Inno Setup:
Instance := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
dónde
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
external '[email protected] stdcall';
Todo el código de la respuesta de esta pregunta lo moví al VCL_Styles.iss
archivo y lo incluí en mi script principal.
El problema es que después de haber pasado la ShellExecute
llamada y terminar por el depurador, una instancia de Inno Setup sigue ejecutándose (así que tengo que terminar el proceso usando el Administrador de tareas de Windows) y recibo los siguientes mensajes en el Debug Output
:
*** Proceso de terminación
*** Eliminando el directorio temporal sobrante: C: \ Users \ JCONST ~ 1 \ AppData \ Local \ Temp \ is-PV9OS.tmp
*** La instalación aún se está ejecutando; no puedo obtener el código de salida
en lugar del código de salida 6 que, según la documentación, se devuelve cuando:
El depurador terminó forzosamente el proceso de instalación (se usó Ejecutar | Terminar en el IDE del compilador).
No estoy seguro de qué instancia de Inno Setup todavía se está ejecutando y cómo puedo detenerla.
Aquí está el contenido del VCL.Styles
que incluyo en mi script principal, así que obtengo el error mencionado anteriormente:
[Setup]
ShowLanguageDialog=no
[Code]
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
external '[email protected] stdcall';
<event('InitializeSetup')>
function MyInitializeSetup2: Boolean;
var
Instance: THandle;
I: Integer;
S, Params, Language: String;
begin
Result := True;
for I := 1 to ParamCount do
begin
S := ParamStr(I);
if CompareText(Copy(S, 1, 5), '/SL5=') <> 0 then
begin
Params := Params + AddQuotes(S) + ' ';
end;
end;
Params := Params + '/LANG=en';
Language := ExpandConstant('{param:LANG}');
if Language = '' then
begin
Instance := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
if Instance <= 32 then
begin
S := 'Running installer with the selected language failed. Code: %d';
MsgBox(Format(S, [Instance]), mbError, MB_OK);
end;
Result := False;
Exit;
end;
end;
Respuestas
Cuando el depurador pasa sobre el ShellExecute
y se inicia la nueva instancia del proceso de instalación, el depurador IDE parece elegir ese proceso y reinicia la depuración. Supongo que este no es un comportamiento intencionado, o al menos no uno bien probado. La función Terminate probablemente intente cerrar / comunicarse con el proceso anterior (que ha terminado por sí solo mientras tanto, debido a que InitializeSetup
regresó False
después de ShellExecute
).
Martijn Laan (el actual mantenedor de Inno Setup) declaró que Inno Setup no está diseñado para reaparecer por sí mismo. En realidad, la propia Exec
API de Inno Setup evita explícitamente la reaparición del instalador. Eludir esta restricción mediante el uso de WinAPI ShellExecute
introduce el problema descrito en la pregunta. No es de extrañar que el depurador no pueda manejar esta situación.
Parece que un error IDE de Inno Setup puede haber causado ese problema.
Aquí está el enlace del informe:
https://groups.google.com/g/innosetup/c/pDSbgD8nbxI/m/0lvTsslOAwAJ