FileForums

FileForums (https://fileforums.com/index.php)
-   Conversion Tutorials (https://fileforums.com/forumdisplay.php?f=55)
-   -   INNO TROUBLESHOOT - Questions Here (https://fileforums.com/showthread.php?t=93193)

Cesar82 15-11-2021 06:40

Quote:

Originally Posted by BYRedex (Post 494904)
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;

Example here

The IsDone callback function (ProgressCallback) does not display the names of all files.
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>);

BYRedex 15-11-2021 09:15

Quote:

Originally Posted by Cesar82 (Post 494907)
The IsDone callback function (ProgressCallback) does not display the names of all files.
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>);

Here is my ProgressCallback code
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;

If you can, please attach an example that I can lean on - it will be easier for me to understand and change my code.
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);


kj911 26-11-2021 13:31

Questions from calculated installed game size info added via INNO setup appsize info: Use raw bytes count on installed all files or use phsycal disk storage count calculated via OS??? (Note: The disk size reservation is related to the sector size. Example: 512byte, 4096byter, 32kB, etc...)

Example:

~160k files, and size in bytes (without uninstaller): 19 034 361 518 byte
OS calculated Disk Space size (NTFS, WinXP): 19 340 095 488 byte

Size difference its ~300MB!

Joe Forster/STA 26-11-2021 23:58

Quote:

Originally Posted by kj911 (Post 495032)
(Note: The disk size reservation is related to the sector size. Example: 512byte, 4096byter, 32kB, etc...)

That's more precisely the cluster size.

fabrieunko 03-12-2021 04:02

Hello, how do I display the installer at the bottom of the screen? instead of being in the middle?

sakhjack 12-05-2022 15:17

[Dying Light] csb file failed CRC check
 
Unarc.dll error code: -12
Error: file ...\Music_2.csb failed CRC check
compression: xtool:mreflate + any other method
things tried: disable AV, install MVC++, increase page file, install on different drive
-----
using different pre-compressor like xt_lzo (or none at all) solves the issue

kj911 24-05-2022 07:39

The task killing code (green line, from use Xtool) its works from newer OS than Win XP??

Code:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
....
ISDoneError:=True;
ISDoneCancel:=1;
Exec('taskkill.exe', '/f /im XT.exe','', SW_HIDE, ewNoWait, ResultCode);
DelTree(ExpandConstant('{app}'), True, True, True);
AllCancel2;
....


Joe Forster/STA 24-05-2022 23:50

Quote:

Originally Posted by kj911 (Post 496961)
The task killing code (green line, from use Xtool) its works from newer OS than Win XP??[/CODE]

It does.

L33THAK0R 05-08-2022 23:02

Is it possible to import an external variable, for example the name of the software package that is defined within a ".ini" config file, for use in an Inno Setup message (namely SetupAppTitle, line 31)?

In essence I'm attempting "SetupAppTitle" to read (for example) "{#Game_Name} Setup", but can't quite figure out if this is possible. I'm currently just manually overwriting the value in question but it is a tad tedious.

KaktoR 06-08-2022 00:35

There are GetIniInt and GetIniString functions.


All times are GMT -7. The time now is 03:11.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2022, vBulletin Solutions Inc.
Copyright 2000-2020, FileForums @ https://fileforums.com