installer - इनो सेटअप: पिछले स्थापित संस्करण को स्वचालित रूप से अनइंस्टॉल कैसे करें?




inno-setup (8)

मैं इंस्टॉलर बनाने के लिए इनो सेटअप का उपयोग कर रहा हूं।

मैं चाहता हूं कि इंस्टॉलर इसे ओवरराइट करने के बजाय स्वचालित रूप से पिछले स्थापित संस्करण को अनइंस्टॉल कर दे। मैं उसे कैसे कर सकता हूँ?


[रन] खंड का उपयोग न करें, लेकिन [अनइंस्टॉलर]। असल में, [रन] के तहत प्रोग्राम को इंस्टॉलेशन के बाद निष्पादित किया जाता है, जिससे इंस्टॉलेशन के तुरंत बाद आपके प्रोग्राम को अनइंस्टॉल कर दिया जाता है: - | इसके बजाय, स्थापना से पहले [UninstallRun] अनुभाग का मूल्यांकन किया जाता है।


आप [कोड] खंड में एक अनइंस्टॉलर निष्पादित कर सकते हैं। आपको यह पता लगाना होगा कि मौजूदा अनइंस्टॉलर का मार्ग कैसे प्राप्त करें। सादगी के लिए जब मैं अपने ऐप्स इंस्टॉल करता हूं तो मैं एक रजिस्ट्री स्ट्रिंग मान जोड़ता हूं जो अनइंस्टॉलर वाले फ़ोल्डर को इंगित करता है, और केवल InitializeWizard कॉलबैक में अनइंस्टॉलर निष्पादित करता है।

ध्यान रखें कि इनो सेटअप अनइंस्टॉलर नाम सभी रूप uninsnnn.exe हैं, आपको इसे अपने कोड में ध्यान में रखना होगा।


इस लिंक का पालन करें: http://news.jrsoftware.org/news/innosetup/msg55323.html

InitializeSetup () फ़ंक्शन में, आप पुराने पुराने संस्करण को अनइंस्टॉल करने के लिए उपयोगकर्ता प्रॉम्प्ट के बाद "MSIEXEC / x {आपका प्रोग्राम आईडी}" कॉल कर सकते हैं


क्रेग मैकक्वीन द्वारा प्रदान किया गया उत्तर पूरी तरह व्यवहार्य है। हालांकि, मैं उन टिप्पणियों को जोड़ूंगा:

  • {#emit SetupSetting("AppId")} कोड मेरे लिए काम नहीं करता है, इसलिए मैं बस अपना ऐप आईडी जोड़ता हूं।
  • मैं अपने अनइंस्टॉलेशन प्रोग्राम को निष्पादित नहीं करना चाहता था, क्योंकि मेरे पास ऐपडेटा / फ़ोल्डर में संग्रहीत आईएनआई कॉन्फ़िगरेशन फ़ाइल है जिसे अनइंस्टॉलर द्वारा हटाया गया है, और मैं नहीं चाहता कि यह एक नया संस्करण स्थापित करते समय मिटा दिया जाए। इसलिए, मैंने क्रेग मैक्यूएन द्वारा प्रदान किए गए कोड को उस बिंदु को संशोधित करने के लिए संशोधित किया है, जहां प्रोग्राम स्थापित किया गया है, इसके पथ को पुनर्प्राप्त करने के बाद।

तो, क्रेग मैक्यूएन के कोड के संबंध में, परिवर्तन हैं:

  • InstallLocation कुंजी के बजाय InstallLocation कुंजी पुनर्प्राप्त UninstallString
  • Exec(sUnInstallString, ...) बजाय DelTree फ़ंक्शन का उपयोग करें

मेरा कुछ छूट रहा है। पुराने इंस्टॉलेशन को हटाने से पहले नई फ़ाइलों को लक्ष्य निर्देशिका में कॉपी किया जाता है। फिर अनइंस्टॉलर उन्हें हटा देता है और निर्देशिका को हटा देता है।


मैंने निम्नलिखित का उपयोग किया है। मुझे यकीन नहीं है कि यह करने का सबसे आसान तरीका है लेकिन यह काम करता है।

यह {#emit SetupSetting("AppId")} का उपयोग करता है जो इनो सेटअप प्रीप्रोसेसर पर निर्भर करता है। यदि आप इसका उपयोग नहीं करते हैं, तो सीधे अपनी ऐप आईडी को काटकर पेस्ट करें।

/////////////////////////////////////////////////////////////////////
function GetUninstallString(): String;
var
  sUnInstPath: String;
  sUnInstallString: String;
begin
  sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1');
  sUnInstallString := '';
  if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then
    RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString);
  Result := sUnInstallString;
end;


/////////////////////////////////////////////////////////////////////
function IsUpgrade(): Boolean;
begin
  Result := (GetUninstallString() <> '');
end;


/////////////////////////////////////////////////////////////////////
function UnInstallOldVersion(): Integer;
var
  sUnInstallString: String;
  iResultCode: Integer;
begin
// Return Values:
// 1 - uninstall string is empty
// 2 - error executing the UnInstallString
// 3 - successfully executed the UnInstallString

  // default return value
  Result := 0;

  // get the uninstall string of the old app
  sUnInstallString := GetUninstallString();
  if sUnInstallString <> '' then begin
    sUnInstallString := RemoveQuotes(sUnInstallString);
    if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then
      Result := 3
    else
      Result := 2;
  end else
    Result := 1;
end;

/////////////////////////////////////////////////////////////////////
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if (CurStep=ssInstall) then
  begin
    if (IsUpgrade()) then
    begin
      UnInstallOldVersion();
    end;
  end;
end;

वैकल्पिक

यह ब्लॉग पोस्ट "संस्करण तुलना के लिए इनो सेटअप स्क्रिप्ट नमूना" भी देखें, जो एक कदम आगे जाता है, और किसी भी पहले स्थापित संस्करण के संस्करण संख्या को पढ़ता है, और वर्तमान संस्करण पैकेज के साथ उस संस्करण संख्या की तुलना करता है।


GetUninstallString() अंदर एक अनइंस्टॉल करने के लिए ऊपर दिए गए GetUninstallString() का उपयोग करने वाले किसी भी व्यक्ति के लिए और डिस्क कैशिंग समस्याएं हैं, एक संबंधित समाधान के लिए नीचे देखें जो वास्तव में अनइंस्टॉलर exe को हटाने के लिए अनइंस्टॉलेशन के बाद थोड़ी देर प्रतीक्षा करता है!

Inno-setup के साथ डिस्क कैशिंग समस्या?


ऐपआईडी (यानी वह मान जिसे आपने [Setup] -क्शन में AppID लिए उपयोग किया गया मान दिया गया है) को रजिस्ट्री से अनइंस्टॉल स्ट्रिंग को पढ़ने में सक्षम होना चाहिए। यह Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\ (या तो HKLM या HKCU हो सकता है, तो दोनों सबसे अच्छी जांच कर सकते हैं) जहां {AppId} को आपके द्वारा उपयोग किए जाने वाले वास्तविक मूल्य के साथ प्रतिस्थापित किया जाना चाहिए। UninstallString या QuietUninstallString मानों को QuietUninstallString और Exec फ़ंक्शन का उपयोग अपने InitializeSetup() ईवेंट फ़ंक्शन से चलाने के लिए InitializeSetup()

अद्यतन: {uninstallexe} साथ एक [Run] -क्शन प्रविष्टि का उपयोग करके गैर-कार्यरत वैकल्पिक समाधान हटा दिया गया - सभी टिप्पणियों के लिए धन्यवाद जिन्होंने इसे इंगित किया!