Gỡ lỗi trình cài đặt Inno Setup tự khởi động lại
Như có thể thấy từ câu hỏi này, chúng tôi bắt đầu một phiên bản mới của Inno Setup:
Instance := ShellExecute(0, '', ExpandConstant('{srcexe}'), Params, '', SW_SHOW);
Ở đâu
function ShellExecute(hwnd: HWND; lpOperation: string; lpFile: string;
lpParameters: string; lpDirectory: string; nShowCmd: Integer): THandle;
external '[email protected] stdcall';
Tất cả mã từ câu trả lời của câu hỏi này tôi đã chuyển vào VCL_Styles.isstệp và đưa nó vào tập lệnh chính của mình.
Vấn đề là sau khi tôi vượt qua ShellExecutecuộc gọi và kết thúc bằng trình gỡ lỗi sau đó, một phiên bản của Inno Setup vẫn tiếp tục chạy (vì vậy tôi phải giết quá trình bằng Windows Task Manager) và tôi nhận được thông báo sau trong Debug Output:
*** Quá trình kết thúc
*** Xóa thư mục tạm thời còn sót lại: C: \ Users \ JCONST ~ 1 \ AppData \ Local \ Temp \ is-PV9OS.tmp
*** Thiết lập vẫn đang chạy; không thể lấy mã thoát
thay vì thoát mã 6 theo tài liệu được trả về khi:
Quá trình Thiết lập đã bị trình gỡ lỗi buộc phải chấm dứt (Run | Terminat đã được sử dụng trong IDE trình biên dịch).
Tôi không chắc phiên bản nào của Inno Setup vẫn đang chạy và làm cách nào để dừng nó?
Đây là nội dung VCL.Stylesmà tôi đưa vào tập lệnh chính của mình nên tôi gặp lỗi đã đề cập ở trên:
[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;
Trả lời
Khi trình gỡ lỗi bước qua ShellExecutevà phiên bản mới của quy trình trình cài đặt được bắt đầu, trình gỡ lỗi IDE dường như chọn quy trình đó và khởi động lại quá trình gỡ lỗi. Tôi cho rằng đây không phải là hành vi dự định, hoặc ít nhất không phải là hành vi đã được kiểm tra kỹ lưỡng. Sau đó, chức năng Termina có thể cố gắng đóng / giao tiếp với tiến trình cũ (đã tự kết thúc trong thời gian đó - do nó InitializeSetupquay trở lại Falsesau ShellExecute).
Martijn Laan (người bảo trì hiện tại của Inno Setup) đã nói rằng Inno Setup không được thiết kế để tự hồi sinh. Trên thực tế, ExecAPI riêng của Inno Setup ngăn chặn rõ ràng việc khởi động lại trình cài đặt. Bỏ qua hạn chế này bằng cách sử dụng WinAPI ShellExecutethay vào đó sẽ giới thiệu vấn đề được mô tả trong câu hỏi. Không có gì ngạc nhiên khi trình gỡ lỗi không thể xử lý tình huống này.
Có vẻ như lỗi IDE của Inno Setup có thể đã gây ra sự cố đó.
Đây là liên kết báo cáo:
https://groups.google.com/g/innosetup/c/pDSbgD8nbxI/m/0lvTsslOAwAJ