|
|
|
#1
|
|||
|
|||
|
Hi all.
Could you please help me with the following: I have an installer for a mod, but if a person uninstalls a mod, the whole game is uninstalled as well. How can I make it so that only the mod files are deleted? I was thinking of keeping an install log and taking files from it to delete, but damn, that doesn't work right. (It doesn't delete files from the list and it doesn't log small files) I'll attach a sample code) Thank you in advance. Code:
Function InitializeUninstall(): Boolean;
begin
ULog := FileExists(ExpandConstant('{app}\INSTALL.LOG')); // you need to get the log now, it might not exist later
if ULog then // if there is a log file, create a sheet where we load the list of files
begin
unins_list := TStringList.Create;
unins_list.LoadFromFile(ExpandConstant('{app}\INSTALL.LOG'));
end;
Result := True;
end;
Procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
i : Integer;
begin
If CurUninstallStep = usPostUninstall then
if ULog then
begin
for i := 0 to unins_list.Count-1 do DeleteFile(unins_list:[i]); // delete files from the list - It doesn't work
unins_list.Free;
end;
end;
|
| Sponsored Links |
|
#2
|
||||
|
||||
|
Quote:
This function is called 4 times per second and only the current filename is shown in the output. If you use a native installation of Inno Setup (No UnArc/ISDone) it will only remove the installed files. But for you to continue using your script you can create a list using FindFirst and FindNext of all the files that are in the game folder right after the ISDoneInit function. After the ISDoneStop function you do a new check using FindFirst and FindNext and compare the names with the previous list using: if oldfileslist.IndexOf(<fullfilename>) < 0 then ins_log.Append(<fullfilename>); |
|
#3
|
|||
|
|||
|
Quote:
Code:
procedure DeinitializeSetup;
begin
BASS_Free;
ForceCloseApp(ExpandConstant('{tmp}'));
end;
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
var
s : AnsiString;
FCurrentFile : String;
begin
if OveralPct<=1000 then ProgressBar.Value(OveralPct);
WizardForm.ProgressGauge.Position:=OveralPct;
FinishLabl5.Text(ExpandConstant('{cm:TIME_TAKEN} ')+TimeStr2);
InsPageLabl4.Text(ExpandConstant('Осталось около: ')+TimeStr1);
InsPageLabl5.Text(ExpandConstant('Прошло около: ')+TimeStr2);
InsPageLabl6.Text(IntToStr(Round(OveralPct div 10))+'% ИЗВЛЕЧЕНО ФАЙЛОВ');
s := ExpandConstant('{cm:Extracting} ') + CurrentFile;
If InsLogBox.LineStrings(InsLogBox.LineCount - 1) <> s Then
begin
FCurrentFile := MinimizePathName(ExpandConstant('{cm:Extracting} ') +CurrentFile, WizardForm.ReadyMemo.Font, 500 - ScaleX(50))
InsLogBox.AddLine(FCurrentFile);
end;
Result := ISDoneCancel;
end;
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode:Integer;
begin
if CurStep = ssPostInstall then
begin
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{tmp}\records.inf'), 5555, 0,0,0, MainForm.Handle, 512, @ProgressCallback) then begin
repeat
ChangeLanguage('english');
SetIniString('srep','temp',ExpandConstant('{app}'),ExpandConstant('{tmp}\cls.ini'));
Installing:=true;
#ifdef Data1
if not ISArcExtract ( 0, {#D1[61]}, ExpandConstant('{src}\{#D1[60]}'), ExpandConstant('{app}'), '', false,('{#Dat1}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data2
if not ISArcExtract ( 0, {#D2[61]}, ExpandConstant('{src}\{#D2[60]}'), ExpandConstant('{app}'), '', false,('{#Dat2}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data3
if not ISArcExtract ( 0, {#D3[61]}, ExpandConstant('{src}\{#D3[60]}'), ExpandConstant('{app}'), '', false,('{#Dat3}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data4
if not ISArcExtract ( 0, {#D4[61]}, ExpandConstant('{src}\{#D4[60]}'), ExpandConstant('{app}'), '', false,('{#Dat4}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data5
if not ISArcExtract ( 0, {#D5[61]}, ExpandConstant('{src}\{#D5[60]}'), ExpandConstant('{app}'), '', false,('{#Dat5}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#ifdef Data6
if not ISArcExtract ( 0, {#D6[61]}, ExpandConstant('{src}\{#D6[60]}'), ExpandConstant('{app}'), '', false,('{#Dat6}'), ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\temp'), false) then break;
#endif
#endif
#endif
#endif
#endif
#endif
ISDoneError:=false;
until true;
ISDoneStop;
end;
end;
And perhaps an IsDone can be substituted? UPD/ I have information displayed in FMemo (InsLogBox : FMemo , can it also be saved to a file?Code:
s := ExpandConstant('{cm:Extracting} ') + CurrentFile;
If InsLogBox.LineStrings(InsLogBox.LineCount - 1) <> s Then
begin
FCurrentFile := MinimizePathName(ExpandConstant('{cm:Extracting} ') +CurrentFile, WizardForm.ReadyMemo.Font, 500 - ScaleX(50))
InsLogBox.AddLine(FCurrentFile);
Last edited by BYRedex; 15-11-2021 at 13:26. |
![]() |
| Thread Tools | Search this Thread |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| INNO TROUBLESHOOT - Tutorials and Answers about INNO Setup | REV0 | Conversion Tutorials | 129 | 21-05-2021 05:51 |
| INNO TUTORIAL - Using Unicode and ANSI Versions of INNO Setup | REV0 | Conversion Tutorials | 51 | 26-03-2015 06:57 |
| Frequently Asked Questions | Joe Forster/STA | PC Games - Frequently Asked Questions | 0 | 29-11-2005 09:48 |