আমি ইনস্টলার তৈরি করতে ইনো সেটআপ ব্যবহার করছি।
আমি ইনস্টলারটি ওভাররাইট করার পরিবর্তে পূর্ববর্তী ইনস্টল করা সংস্করণটি স্বয়ংক্রিয়ভাবে আনইনস্টল করতে চাই। আমি এটা কিভাবে করবো?
আমি ইনস্টলার তৈরি করতে ইনো সেটআপ ব্যবহার করছি।
আমি ইনস্টলারটি ওভাররাইট করার পরিবর্তে পূর্ববর্তী ইনস্টল করা সংস্করণটি স্বয়ংক্রিয়ভাবে আনইনস্টল করতে চাই। আমি এটা কিভাবে করবো?
উত্তর:
অ্যাপিআইডি দেওয়া (যেমন AppID
- [Setup]
সেকশনে আপনি যে মানটি ব্যবহার করেছেন ) দিয়ে আপনার রেজিস্ট্রি থেকে আনইনস্টল স্ট্রিং পড়তে সক্ষম হওয়া উচিত । এটি এর অধীনে পাওয়া যেতে পারে Software\Microsoft\Windows\CurrentVersion\Uninstall\{AppId}\
( উভয়ই হতে পারে HKLM
বা HKCU
তাই, উভয়ই চেক করুন) যেখানে {AppId}
আপনার ব্যবহৃত প্রকৃত মানের সাথে প্রতিস্থাপন করা উচিত। দেখুন UninstallString
অথবা QuietUninstallString
মূল্যবোধ ও ব্যবহার Exec
আপনার থেকে এটি চালানোর জন্য ফাংশন InitializeSetup()
ঘটনা ফাংশন।
আপডেট: এর[Run]
সাথে একটি- অ্যাকশন এন্ট্রি ব্যবহার করে অ-কর্মক্ষম বিকল্প সমাধান সরিয়ে নিয়েছে {uninstallexe}
- এটি নির্দেশকারী সমস্ত মন্তব্যকারীকে ধন্যবাদ!
[Run]
বিভাগটির সমাধানটি কাজ করবে, কারণ এটি ইনস্টলেশন প্রক্রিয়াতে খুব দেরিতে চলে। ইনো সেটআপ ম্যানুয়াল থেকে: [রান] বিভাগটি isচ্ছিক, এবং প্রোগ্রামটি সফলভাবে ইনস্টল হওয়ার পরে কার্যকর করার জন্য বেশ কয়েকটি প্রোগ্রাম সুনির্দিষ্ট করে তবে সেটআপ প্রোগ্রামের আগে চূড়ান্ত ডায়ালগটি প্রদর্শিত হয়।
আমি নিম্নলিখিত ব্যবহার করেছি। আমি নিশ্চিত না যে এটি করার সহজতম উপায় তবে এটি কার্যকর হয়।
এটি ব্যবহার করে {#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()
ডিস্ক ক্যাচিংয়ের সমস্যাগুলি ব্যবহার করে তার জন্য নীচে দেখুন একটি সম্পর্কিত সমাধানের জন্য যা বাস্তবে মোছার জন্য আনইনস্টলারের এক্সেস্টিলেশন পরে কিছুক্ষণ অপেক্ষা করে!
আপনি [কোড] বিভাগে একটি আনইনস্টলার চালাতে পারেন। বিদ্যমান আনইনস্টলারের পথ কীভাবে পাবেন তা আপনাকে খুঁজে বের করতে হবে। সরলতার জন্য যখন আমি আমার অ্যাপ্লিকেশনগুলি ইনস্টল করি তখন আমি একটি রেজিস্ট্রি স্ট্রিংয়ের মান যুক্ত করি যা আনইনস্টলারযুক্ত ফোল্ডারে নির্দেশ করে এবং কেবল ইনিশালাইজ উইজার্ড কলব্যাকে আনইনস্টলারটি সম্পাদন করে।
মনে রাখবেন যে ইনো সেটআপ আনইনস্টলারের নামগুলি হ'ল আনইনএন.এক্সই ফর্মের সমস্ত, আপনার কোডটিতে এটি অ্যাকাউন্টে নেওয়া উচিত।
আমি @ ক্রেন ম্যাক-কুইন কোডটি সম্পাদনা করেছি, আমার মনে হয় এই কোডটি আরও ভাল কারণ বিভিন্ন প্রকল্পে পরিবর্তন করার দরকার নেই:
[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
ইনিশিয়ালসেটআপ () ফাংশনে, পুরানো পুরাতন সংস্করণ আনইনস্টল করার জন্য ব্যবহারকারীকে অনুরোধ করার পরে আপনি "এমএসআইএক্সইসি / এক্স {আপনার প্রোগ্রামের আইডি call" কল করতে পারেন