Kendini yeniden ortaya çıkaran Inno Setup yükleyicisinde hata ayıklama
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.iss
dosyaya taşındım ve ana betiğime ekledim.
Sorun şu ki, ShellExecute
aramayı 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.Styles
ana 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
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 InitializeSetup
döndükten False
sonra 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 Exec
API'si, yükleyicinin yeniden doğmasını açıkça engeller. Bu kısıtlamayı WinAPI kullanarak atlamak, ShellExecute
bunun yerine soruda açıklanan sorunu ortaya çıkarır . Hata ayıklayıcının bu durumla başa çıkamaması sürpriz değil.
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