Kendini yeniden ortaya çıkaran Inno Setup yükleyicisinde hata ayıklama

Dec 21 2020

Bu sorudan görülebileceği gibi, Inno Setup'ın yeni bir örneğini başlatıyoruz:

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

nerede

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

Bu sorunun cevabındaki tüm kodlar VCL_Styles.issdosyaya taşındım ve ana betiğime ekledim.

Sorun şu ki, ShellExecutearamayı geçtikten ve hata ayıklayıcı tarafından sonlandırıldıktan sonra bir Inno Setup örneği çalışmaya devam ediyor (bu yüzden Windows Görev Yöneticisi'ni kullanarak işlemi sonlandırmalıyım) ve aşağıdaki mesajları alıyorum Debug Output:

*** İşlemi sonlandırma

*** Kalan geçici dizini kaldırma: C:\Users\JCONST~1\AppData\Local\Temp\is-PV9OS.tmp

*** Kurulum hala çalışıyor; çıkış kodu alınamıyor

belgelere göre aşağıdaki durumlarda döndürülen çıkış kodu 6 yerine :

Kurulum işlemi hata ayıklayıcı tarafından zorla sonlandırıldı (Derleyici IDE'sinde Run | Terminate kullanıldı).

Inno Setup'ın hangi örneğinin hala çalıştığından emin değilim ve bunu nasıl durdurabilirim?

İşte VCL.Stylesana betiğime eklediğim içeriğin içeriği, bu yüzden yukarıda belirtilen hatayı alıyorum:

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

Yanıtlar

1 MartinPrikryl Dec 28 2020 at 14:51

Hata ayıklayıcı ShellExecute, yükleyici işleminin yeni örneğini geçtiğinde ve başlatıldığında, IDE hata ayıklayıcısı bu süreci seçiyor ve hata ayıklamayı yeniden başlatıyor. Bunun amaçlanan davranış olmadığını veya en azından iyi test edilmediğini varsayıyorum. Sonlandır fonksiyonu daha sonra muhtemelen / (- onun yüzünden kendi arada üzerinde sonlandırdı eski sürecine iletişim kapatmaya çalıştığında InitializeSetupdöndükten Falsesonra ShellExecute).

Martijn Laan (Inno Setup'ın şu anki bakıcısı), Inno Setup'ın kendini yeniden canlandırmak için tasarlanmadığını belirtti. Aslında Inno Setup'ın kendi ExecAPI'si, yükleyicinin yeniden doğmasını açıkça engeller. Bu kısıtlamayı WinAPI kullanarak atlamak, ShellExecutebunun yerine soruda açıklanan sorunu ortaya çıkarır . Hata ayıklayıcının bu durumla başa çıkamaması sürpriz değil.

JConstantine Dec 21 2020 at 21:46

Bir Inno Setup'ın IDE hatası bu soruna neden olmuş gibi görünüyor.

İşte rapor linki:

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