스스로 리스폰되는 Inno Setup 설치 프로그램 디버깅

Dec 21 2020

이 질문 에서 알 수 있듯이 Inno Setup의 새 인스턴스를 시작합니다.

Instance := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);

어디

function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
      lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
      external '[email protected] stdcall';

이 질문에 대한 답변의 모든 코드 는 VCL_Styles.iss파일 로 이동하여 기본 스크립트에 포함 시켰습니다.

문제는 ShellExecute호출을 통과하고 디버거에 의해 종료 된 후 Inno Setup의 한 인스턴스가 계속 실행되고 (따라서 Windows 작업 관리자를 사용하여 프로세스를 종료해야 함) 다음 메시지가 표시된다는 것입니다 Debug Output.

*** 종료 프로세스

*** 남은 임시 디렉토리 제거 : C : \ Users \ JCONST ~ 1 \ AppData \ Local \ Temp \ is-PV9OS.tmp

*** 설치가 아직 실행 중입니다. 종료 코드를 얻을 수 없습니다

문서 에 따라 다음과 같은 경우에 반환 되는 종료 코드 6 대신

설치 프로세스가 디버거에 의해 강제로 종료되었습니다 (컴파일러 IDE에서 실행 | 종료가 사용됨).

Inno Setup의 어떤 인스턴스가 아직 실행 중인지 확실하지 않으며 어떻게 중지 할 수 있습니까?

다음 VCL.Styles은 앞서 언급 한 오류가 발생하도록 기본 스크립트에 포함하는 의 내용입니다 .

[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;

답변

1 MartinPrikryl Dec 28 2020 at 14:51

디버거가 단계를 넘어 ShellExecute설치 프로그램 프로세스의 새 인스턴스가 시작되면 IDE 디버거가 해당 프로세스를 선택하고 디버깅을 다시 시작합니다. 나는 이것이 의도 된 행동이 아니거나 적어도 잘 테스트 된 행동이 아니라고 가정합니다. 종료 함수는 아마 / (- 그것으로 인해 자신의 사이에 종료 된 이전 프로세스와 통신을 종료하려고 InitializeSetup돌아 False애프터 ShellExecute).

Martijn Laan (현재 Inno Setup의 관리자)은 Inno Setup이 스스로 부활하도록 설계되지 않았다고 말했습니다. 실제로 Inno Setup 자체 ExecAPI는 설치 프로그램의 리스폰을 명시 적으로 방지합니다. ShellExecute대신 WinAPI 를 사용하여이 제한을 우회 하면 질문에 설명 된 문제가 발생합니다. 디버거가이 상황을 처리 할 수 ​​없다는 것은 놀라운 일이 아닙니다.

JConstantine Dec 21 2020 at 21:46

Inno Setup의 IDE 버그로 인해 문제가 발생한 것 같습니다.

보고서 링크는 다음과 같습니다.

https://groups.google.com/g/innosetup/c/pDSbgD8nbxI/m/0lvTsslOAwAJ