डिबगिंग इनो सेटअप इंस्टॉलर जो खुद को रिस्पना करता है

Dec 21 2020

जैसा कि इस प्रश्न से देखा जा सकता है कि हम इनो सेटअप का एक नया उदाहरण शुरू करते हैं:

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;

जवाब

1 MartinPrikryl Dec 28 2020 at 14:51

जब डिबगर कदम बढ़ाता है ShellExecuteऔर इंस्टॉलर प्रक्रिया का नया उदाहरण शुरू होता है, तो IDE डीबगर उस प्रक्रिया को चुनता है और डिबगिंग को पुनरारंभ करता है। मुझे लगता है कि यह इरादा व्यवहार नहीं है, या कम से कम एक अच्छी तरह से परीक्षण नहीं किया गया है। बर्खास्त समारोह तो शायद बंद करने के लिए पुराने प्रक्रिया (- अपने की वजह से जो अपनी ही इस बीच पर समाप्त कर दिया है करने के लिए के साथ / संवाद की कोशिश करता है InitializeSetupलौटने Falseके बाद ShellExecute)।

मार्टिजन लान (इनो सेटअप के वर्तमान अनुरक्षक) ने कहा कि इनो सेटअप को स्वयं को पुन: उत्पन्न करने के लिए डिज़ाइन नहीं किया गया है। वास्तव में इनो सेटअप स्वयं का Execएपीआई स्पष्ट रूप से इंस्टॉलर को प्रतिक्रिया देने से रोकता है। WinAPI का उपयोग करके इस प्रतिबंध को छोड़कर ShellExecuteप्रश्न में वर्णित समस्या का परिचय देता है। यह आश्चर्य की बात नहीं है कि डीबगर इस स्थिति को संभाल नहीं सकता है।

JConstantine Dec 21 2020 at 21:46

ऐसा लगता है कि इनो सेटअप के IDE बग के कारण यह समस्या हो सकती है।

यहाँ रिपोर्ट लिंक है:

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