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




inno-setup (9)

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

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

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

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


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

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


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


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

यह {#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;

वैकल्पिक

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


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


मुझे @Crain Mc-Queen कोड संपादित किया गया, मुझे लगता है कि यह कोड बेहतर है क्योंकि विभिन्न प्रोजेक्ट में संशोधित करने की आवश्यकता नहीं है:

[Code]
function GetNumber(var temp: String): Integer;
var
  part: String;
  pos1: Integer;
begin
  if Length(temp) = 0 then
  begin
    Result := -1;
    Exit;
  end;
    pos1 := Pos('.', temp);
    if (pos1 = 0) then
    begin
      Result := StrToInt(temp);
    temp := '';
    end
    else
    begin
    part := Copy(temp, 1, pos1 - 1);
      temp := Copy(temp, pos1 + 1, Length(temp));
      Result := StrToInt(part);
    end;
end;

function CompareInner(var temp1, temp2: String): Integer;
var
  num1, num2: Integer;
begin
    num1 := GetNumber(temp1);
  num2 := GetNumber(temp2);
  if (num1 = -1) or (num2 = -1) then
  begin
    Result := 0;
    Exit;
  end;
      if (num1 > num2) then
      begin
        Result := 1;
      end
      else if (num1 < num2) then
      begin
        Result := -1;
      end
      else
      begin
        Result := CompareInner(temp1, temp2);
      end;
end;

function CompareVersion(str1, str2: String): Integer;
var
  temp1, temp2: String;
begin
    temp1 := str1;
    temp2 := str2;
    Result := CompareInner(temp1, temp2);
end;

function InitializeSetup(): Boolean;
var
  oldVersion: String;
  uninstaller: String;
  ErrorCode: Integer;
  vCurID      :String;
  vCurAppName :String;
begin
  vCurID:= '{#SetupSetting("AppId")}';
  vCurAppName:= '{#SetupSetting("AppName")}';
  //remove first "{" of ID
  vCurID:= Copy(vCurID, 2, Length(vCurID) - 1);
  //
  if RegKeyExists(HKEY_LOCAL_MACHINE,
    'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1') then
  begin
    RegQueryStringValue(HKEY_LOCAL_MACHINE,
      'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1',
      'DisplayVersion', oldVersion);
    if (CompareVersion(oldVersion, '{#SetupSetting("AppVersion")}') < 0) then      
    begin
      if MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' is already installed. Continue to use this old version?',
        mbConfirmation, MB_YESNO) = IDYES then
      begin
        Result := False;
      end
      else
      begin
          RegQueryStringValue(HKEY_LOCAL_MACHINE,
            'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + vCurID + '_is1',
            'UninstallString', uninstaller);
          ShellExec('runas', uninstaller, '/SILENT', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
          Result := True;
      end;
    end
    else
    begin
      MsgBox('Version ' + oldVersion + ' of ' + vCurAppName + ' is already installed. This installer will exit.',
        mbInformation, MB_OK);
      Result := False;
    end;
  end
  else
  begin
    Result := True;
  end;
end;

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

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

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

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

इनो सेटअप का उपयोग करते समय, पिछले संस्करण को अनइंस्टॉल करने का कोई कारण नहीं है जब तक कि वह संस्करण एक अलग इंस्टॉलर प्रोग्राम द्वारा स्थापित नहीं किया गया हो। अन्यथा उन्नयन स्वचालित रूप से संभाला जाता है।


यदि आप "पुराने आइकन को हटाना चाहते हैं" (क्योंकि आपका बदला / अपडेट हो गया है) तो आप इसका उपयोग कर सकते हैं:

; attempt to remove previous versions' icons
[InstallDelete]
Type: filesandordirs; Name: {group}\*;

यह "स्थापना की शुरुआत में" चलाया जाता है, इसलिए मूल रूप से पुराने आइकन हटा दिए जाते हैं, और यह पूरी तरह से पूरा होने के बाद भी आपके नए लोग इंस्टॉल किए जाएंगे।

मैं बस हर इंस्टॉलेशन के साथ ऐसा करता हूं "यदि कुछ भी बदल गया है" आइकन के अनुसार (यह सब वैसे भी पुनर्स्थापित हो जाता है)।