मैं एक इंस्टॉलर बनाने के लिए इनो सेटअप का उपयोग कर रहा हूं।
मैं चाहता हूं कि इंस्टॉलर इसे अधिलेखित करने के बजाय पिछले स्थापित संस्करण को स्वचालित रूप से अनइंस्टॉल कर दे। मैं उसे कैसे कर सकता हूँ?
मैं एक इंस्टॉलर बनाने के लिए इनो सेटअप का उपयोग कर रहा हूं।
मैं चाहता हूं कि इंस्टॉलर इसे अधिलेखित करने के बजाय पिछले स्थापित संस्करण को स्वचालित रूप से अनइंस्टॉल कर दे। मैं उसे कैसे कर सकता हूँ?
जवाबों:
आपको AppId (यानी -section AppID
में आपके द्वारा उपयोग किया जाने वाला मूल्य [Setup]
) को देखते हुए, आपको रजिस्ट्री से अनइंस्टॉल स्ट्रिंग पढ़ने में सक्षम होना चाहिए । इसके तहत पाया जा सकता है Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\
( HKLM
या तो हो सकता है या HKCU
, इसलिए दोनों की सर्वोत्तम जांच करें) जहां {AppId}
आपके द्वारा उपयोग किए गए वास्तविक मूल्य के साथ प्रतिस्थापित किया जाना चाहिए। के लिए देखो UninstallString
या QuietUninstallString
मूल्यों और का उपयोग Exec
अपने से इसे चलाने के लिए समारोह InitializeSetup()
घटना कार्य करते हैं।
अद्यतन: गैर-काम कर रहे वैकल्पिक समाधान के [Run]
साथ -section प्रविष्टि का उपयोग करके हटा दिया गया {uninstallexe}
- उन सभी टिप्पणीकारों को धन्यवाद जिन्होंने इसे इंगित किया था!
[Run]
अनुभाग समाधान काम करेगा, क्योंकि यह स्थापना प्रक्रिया में बहुत देर से चलता है। इनो सेटअप मैनुअल से: [रन] अनुभाग वैकल्पिक है, और प्रोग्राम को सफलतापूर्वक इंस्टॉल किए जाने के बाद निष्पादित करने के लिए किसी भी संख्या को निर्दिष्ट करता है, लेकिन सेटअप प्रोग्राम अंतिम संवाद प्रदर्शित करने से पहले।
मैंने निम्नलिखित का उपयोग किया है। मुझे यकीन नहीं है कि यह करने का सबसे सरल तरीका है लेकिन यह काम करता है।
यह उपयोग {#emit SetupSetting("AppId")}
जो इनो सेटअप प्रीप्रोसेसर पर निर्भर करता है। यदि आप इसका उपयोग नहीं करते हैं, तो सीधे अपनी ऐप आईडी को काटें और चिपकाएँ।
[Code]
{ ///////////////////////////////////////////////////////////////////// }
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;
वैकल्पिक
इस ब्लॉग पोस्ट "संस्करण तुलना के लिए इनो सेटअप स्क्रिप्ट नमूना" भी देखें जो एक कदम आगे जाता है, और किसी भी पहले से स्थापित संस्करण के संस्करण संख्या को पढ़ता है, और उस संस्करण संख्या की तुलना वर्तमान स्थापना पैकेज से करता है।
... UserSIDs: TArrayOfString; I: Integer; ... if not RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString) then if isAdminLoggedOn() and RegGetSubkeyNames( HKEY_USERS, '', UserSIDs ) then for I := 0 to GetArrayLength( UserSIDs ) - 1 do begin if RegQueryStringValue( HKEY_USERS, UserSIDs[I] + '\' + sUnInstPath, 'UninstallString', sUnInstallString ) then break; end;
यदि आप "पुराने आइकन हटाना चाहते हैं" (क्योंकि आपका परिवर्तन / अद्यतन हो गया है) तो आप इसका उपयोग कर सकते हैं:
; attempt to remove previous versions' icons
[InstallDelete]
Type: filesandordirs; Name: {group}\*;
यह "इंस्टॉलेशन की शुरुआत में" चलाया जाता है, इसलिए मूल रूप से पुराने आइकन हटाता है, और आपके नए पूरी तरह से स्थापित होने के बाद भी वहां स्थापित किए जाएंगे।
मैं बस हर इंस्टॉल के साथ ऐसा करता हूं "अगर कुछ भी बदल गया है" आइकन वार (यह सब वैसे भी फिर से इंस्टॉल हो जाता है)।
इनो सेटअप का उपयोग करते समय, पिछले संस्करण की स्थापना रद्द करने का कोई कारण नहीं है जब तक कि उस संस्करण को अलग इंस्टॉलर प्रोग्राम द्वारा स्थापित नहीं किया गया था। अन्यथा उन्नयन स्वचालित रूप से नियंत्रित किया जाता है।
[InstallDelete]
पुरानी फ़ाइलों / निर्देशिकाओं को निकालने के लिए बस एक अनुभाग का उपयोग कर सकते हैं । नई फ़ाइलों को स्थापना के दौरान सही स्थानों पर रखा जाएगा।
क्रेग मैकक्वीन द्वारा प्रदान किया गया उत्तर पूरी तरह से व्यवहार्य है। हालाँकि, मैं उन टिप्पणियों को जोड़ूंगा:
{#emit SetupSetting("AppId")}
कोड, मेरे लिए काम नहीं करता है तो मैं बस अपना ऐप्लिकेशन आईडी जोड़ें।तो, क्रेग मैकक्वीन के कोड के बारे में, परिवर्तन हैं:
InstallLocation
कुंजी के बजाय कुंजी को पुनः प्राप्त करें UninstallString
।DelTree
बजाय फ़ंक्शन का उपयोग करेंExec(sUnInstallString, ...)
किसी के लिए जो GetUninstallString()
ऊपर दिए गए सुझाव का उपयोग करता है एक अनइंस्टॉल को मजबूर करने के लिए CurStepChanged()
और डिस्क कैशिंग मुद्दों के लिए, संबंधित समाधान के लिए नीचे देखें जो वास्तव में अनइंस्टालर के लिए अनइंस्टाल करने के बाद थोड़ी देर इंतजार करता है जिसे हटा दिया जाना है!
आप [कोड] अनुभाग में एक अनइंस्टालर को निष्पादित कर सकते हैं। आपको यह पता लगाना होगा कि मौजूदा अनइंस्टालर को रास्ता कैसे मिलेगा। सादगी के लिए जब मैं अपने एप्लिकेशन इंस्टॉल करता हूं तो मैं रजिस्ट्री स्ट्रिंग मान जोड़ता हूं जो कि अनइंस्टालर वाले फ़ोल्डर को इंगित करता है, और अनइंस्टालरवेयर कॉलबैक में अनइंस्टालर को निष्पादित करता है।
ध्यान रखें कि इनो सेटअप अनइंस्टालर नाम सभी फॉर्म uninsnnn.exe के हैं, आपको अपने कोड में इसे ध्यान में रखना होगा।
मुझे @ Mc-रानी कोड संपादित मिला, मुझे लगता है कि यह कोड बेहतर है क्योंकि अलग-अलग परियोजना में संशोधित करने की आवश्यकता नहीं है:
[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;
मेरा कुछ छूट रहा है। नई फ़ाइलें लक्ष्य निर्देशिका को कॉपी कर रहे हैं से पहले पुराने स्थापना को हटाने होता है। फिर आता है कि अनइंस्टालर उन्हें हटा देता है और निर्देशिका को हटा देता है।
[रन] अनुभाग का उपयोग न करें, लेकिन [स्थापना रद्द करें]। वास्तव में, [रन] के तहत प्रोग्राम को इंस्टॉलेशन के बाद निष्पादित किया जाता है, जिससे इंस्टॉलेशन के तुरंत बाद आपके प्रोग्राम को अनइंस्टॉल किया जा सकता है: - | इसके बजाय, स्थापना से पहले [स्थापना रद्द करें] अनुभाग का मूल्यांकन किया जाता है ।
[UninstallRun]
सवाल का हल नहीं है।
इस लिंक का पालन करें: http://news.jrsoftware.org/news/innosetup/msg55323.html
InitializeSetup () फ़ंक्शन में, आप उपयोगकर्ता के पुराने संस्करण की स्थापना रद्द करने के लिए उपयोगकर्ता संकेत के बाद "MSIEXEC / x {आपका प्रोग्राम ID}" कह सकते हैं