Instalador de depuración de Inno Setup que reaparece

Dec 21 2020

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.issarchivo y lo incluí en mi script principal.

El problema es que después de haber pasado la ShellExecutellamada 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.Stylesque 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

1 MartinPrikryl Dec 28 2020 at 14:51

Cuando el depurador pasa sobre el ShellExecutey 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 InitializeSetupregresó Falsedespué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 ExecAPI de Inno Setup evita explícitamente la reaparición del instalador. Eludir esta restricción mediante el uso de WinAPI ShellExecuteintroduce el problema descrito en la pregunta. No es de extrañar que el depurador no pueda manejar esta situación.

JConstantine Dec 21 2020 at 21:46

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