डिबगिंग इनो सेटअप इंस्टॉलर जो खुद को रिस्पना करता है
जैसा कि इस प्रश्न से देखा जा सकता है कि हम इनो सेटअप का एक नया उदाहरण शुरू करते हैं:
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
कॉल पास करने और डीबगर द्वारा समाप्त करने के बाद इनो सेटअप का एक उदाहरण चल रहा है (इसलिए मुझे विंडोज टास्क मैनेजर का उपयोग करके प्रक्रिया को मारना है) और मुझे निम्न संदेश मिलते हैं Debug Output
:
*** समाप्ति प्रक्रिया
*** बचे हुए अस्थायी निर्देशिका को हटाना: C:\Users\JCONST~1\AppData\Local\Temp\is-PV9OS.tmp
*** सेटअप अभी भी चल रहा है; निकास कोड नहीं मिल सकता
निकास कोड 6 के बजाय जो दस्तावेज़ीकरण के अनुसार लौटाया जाता है जब:
डिबगर द्वारा सेटअप प्रक्रिया को बलपूर्वक समाप्त कर दिया गया था (रन | टर्मिनेट का उपयोग कंपाइलर आईडीई में किया गया था)।
मुझे नहीं पता कि इनो सेटअप का कौन सा इंस्टेंस अभी भी चल रहा है और मैं इसे कैसे रोक सकता हूं?
यहां इसकी सामग्री है 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;
जवाब
जब डिबगर कदम बढ़ाता है ShellExecute
और इंस्टॉलर प्रक्रिया का नया उदाहरण शुरू होता है, तो IDE डीबगर उस प्रक्रिया को चुनता है और डिबगिंग को पुनरारंभ करता है। मुझे लगता है कि यह इरादा व्यवहार नहीं है, या कम से कम एक अच्छी तरह से परीक्षण नहीं किया गया है। बर्खास्त समारोह तो शायद बंद करने के लिए पुराने प्रक्रिया (- अपने की वजह से जो अपनी ही इस बीच पर समाप्त कर दिया है करने के लिए के साथ / संवाद की कोशिश करता है InitializeSetup
लौटने False
के बाद ShellExecute
)।
मार्टिजन लान (इनो सेटअप के वर्तमान अनुरक्षक) ने कहा कि इनो सेटअप को स्वयं को पुन: उत्पन्न करने के लिए डिज़ाइन नहीं किया गया है। वास्तव में इनो सेटअप स्वयं का Exec
एपीआई स्पष्ट रूप से इंस्टॉलर को प्रतिक्रिया देने से रोकता है। WinAPI का उपयोग करके इस प्रतिबंध को छोड़कर ShellExecute
प्रश्न में वर्णित समस्या का परिचय देता है। यह आश्चर्य की बात नहीं है कि डीबगर इस स्थिति को संभाल नहीं सकता है।
ऐसा लगता है कि इनो सेटअप के IDE बग के कारण यह समस्या हो सकती है।
यहाँ रिपोर्ट लिंक है:
https://groups.google.com/g/innosetup/c/pDSbgD8nbxI/m/0lvTsslOAwAJ