दिलचस्प पोस्ट
Django आराम फ्रेमवर्क फ़ाइल अपलोड करें मैं शॉर्ट सर्किट के लिए आलसी seqs के लिए Clojure के चंकिंग व्यवहार से कैसे बचूं? मैं JFrame में शीर्षक पट्टी का रंग कैसे बदल सकता / सकती हूं? एक सूची से हटाना, जबकि इसे खत्म करना कैसे HTML सांकेतिक शब्दों में बदलना / एक स्ट्रिंग से बचने के लिए? क्या इसमें अंतर्निहित है? एचपी प्रॉक्सी के पीछे PHP कम्पोज़र कैसे 2 या अधिक .WAV फ़ाइलें एक साथ कार्यक्रम में शामिल होने के लिए? <मेटा वर्णसेट = "यूटीएफ -8"> बनाम <मेटा http-equiv = "सामग्री-प्रकार"> एचईएल टैग को विभाजित करने के लिए रेगेक्स एक आईपीवी 6 पते की शाब्दिक प्रतिनिधित्व की अधिकतम लंबाई? क्या ब्राउज़र की चौड़ाई पर आधारित पाठ आकार गतिशील रूप से संभव है? एकाधिक पंक्तियों को एक अल्पविराम-पृथक मान MySQL – एक क्वेरी के साथ कई तालिकाओं से हटाएं डायनेमिक रूप से बनाए गए <iframe> को <script> को अभिभावक पृष्ठ में स्क्रिप्ट चलाने क्यों लगता है? सीमैके को विज़ुअल सी ++ कंपाइलर नहीं मिल रहा है

Inno सेटअप: कैसे स्वचालित रूप से पिछले स्थापित संस्करण की स्थापना रद्द करें?

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

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

Solutions Collecting From Web of "Inno सेटअप: कैसे स्वचालित रूप से पिछले स्थापित संस्करण की स्थापना रद्द करें?"

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

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

मैंने निम्नलिखित का इस्तेमाल किया है मुझे यकीन नहीं है कि यह करने का सबसे आसान तरीका है लेकिन यह काम करता है

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

 ///////////////////////////////////////////////////////////////////// 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; 

वैकल्पिक

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

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

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

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

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

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

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

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

इसलिए, क्रेग मैक्वीन के कोड के बारे में, परिवर्तन हैं:

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

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

 [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; 

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

ध्यान रखें कि Inno सेटअप अनइंस्टॉलर के नाम सभी फार्म uninsnnn.exe हैं, आपको उस कोड को अपने कोड में लेने की आवश्यकता है।

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

इनो-सेटअप के साथ डिस्क कैशिंग समस्या?

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

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

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

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