Go Back   FileForums > Game Backup > PC Games > PC Games - CD/DVD Conversions > Conversion Tutorials

Reply
 
Thread Tools Display Modes
  #1  
Old 13-09-2024, 13:26
BLACKFIRE69's Avatar
BLACKFIRE69 BLACKFIRE69 is offline
Registered User
 
Join Date: Mar 2019
Location: In the Hell
Posts: 668
Thanks: 471
Thanked 2,374 Times in 542 Posts
BLACKFIRE69 is on a distinguished road
Arrow InnoSetup - Private Edition

Code:
Project:    InnoSetup - Private Edition  
Based on:   v6.4.0-dev (latest)  
Changes by: BLACKFIRE69

What's New:

Code:
* Added Setup Directives:
    - Cursor
    - ResourceFiles
    - StorePrivateKey
    - StyleFile
    - EnableTaskbarPreview
    - AlphaBlendValue

* Added Script Functions:

  - File Extraction:
    - procedure ExtractTemporaryFileEx(const BaseName: String; const DestDir: string);
    - function ExtractTemporaryFilesEx(const Pattern: String; const DestDir: string): Integer;
    - function ExtractTemporaryFileSize(const BaseName: String): Cardinal;
    - function ExtractTemporaryFileToBuffer(const BaseName: String; Buffer: Integer): Boolean;
    - function ExtractTemporaryFileToStream(const BaseName: String; const Stream: TStream): Boolean;
  
    - function ExtractResourceFile(const ResourceName: string; const OutFile: String): Boolean;
    - function ExtractResourceFileSize(const ResourceName: String): Cardinal;
    - function ExtractResourceFileToBuffer(const ResourceName: String; Buffer: Integer): Boolean;
    - function ExtractResourceFileToStream(const ResourceName: String; const Stream: TStream): Boolean;

  - Type Casting:
    - function CastAnsiStringToInteger(var S: AnsiString): LongInt;
    - function CastIntegerToAnsiString(const L: LongInt): AnsiString;
    - function wBufferToFile(const Buffer: Integer; const Count: Cardinal; const OutFile: WideString): Boolean;

  - Private Key Handling:
    - function GetStoredPrivateKey(const TheRealKey: Boolean): String;
Code:
  - Installation Control:
    - procedure BeginInstallProcPause;
    - procedure EndInstallProcPause;
    - function IsInstallProcPaused: Boolean;

  - Audio Playback:
    - function PlayWavFile1(const WavFileName: WideString): Boolean;
    - function PlayWavFile2(const WavFileName: WideString; Flags: Cardinal): Boolean;
    - function PlayWavFile3(const WavFileName: WideString; Handle, Flags: Cardinal): Boolean;

  - System Icon Retrieval:
    - function wGetSysDefaultIcons(const Src: WideString; SHLIcoSize: Cardinal; const Buffer: Integer; var Count: Cardinal): Integer;
    - function wGetSysDefaultIcons2(const Src, OutImgFile: WideString; SHLIcoSize: Cardinal): Boolean;
    - function wGetSysDefaultIconsSize(const Src: WideString; SHLIcoSize: Cardinal): Integer;

    - function wGetSysDefaultIconsFromResLib(const AModule: WideString; AIndex, RISIcoSize: Cardinal; const Buffer: Integer; var Count: Cardinal): Integer;
    - function wGetSysDefaultIconsFromResLib2(const AModule, AOutFile: WideString; AIndex, RISIcoSize: Cardinal): Boolean;
    - function wGetSysDefaultIconsSizeFromResLib(const AModule: WideString; AIndex, RISIcoSize: Cardinal): Integer;

* Added Setup Event Functions:
    - procedure CurInstallProgressChangedEx(CurProgress, MaxProgress, iPercentage: Integer; sElapsed, sRemaining: String);
    - procedure InitializeWizardEve();
Code:
* Added Classes:
    - TApplication
    - TMemoryStream
    - TResourceStream
    - TImgSlideshow → SlideShow
    - TSplashImage → SplashScreen
    - TSplashImageAnimated → SplashScreenAnimated
    - TWaterRipples → WaterRipples

* Added Class Variables:
    - Application: TApplication

* Added Properties and Functions:
  
  - WizardForm:
      - WizardForm.AlphaBlendValue: Byte;
      - WizardForm.DoubleBuffered: Boolean;
  
      - WizardForm.BlendOnMoveEnable(const AllowOnDeactive: Boolean);
      - WizardForm.BlendOnMovePause(const Paused: Boolean);
      - WizardForm.BlendOnMoveOpacity(const AlphaValue: Byte);
      - WizardForm.BlendOnMoveIsPaused: Boolean;
  
      - WizardForm.CreateRgn(const sMaskBmp: WideString; iTrRGBColor: Integer): Integer;
      - WizardForm.CreateRgnFromBuffer(const Buffer: PAnsiChar; const Count: Cardinal; iTrRGBColor: Integer): Integer;
      - WizardForm.CreateFormFromBmp(const sBmpFile: WideString; bACPremultiplied, bDraggableForm: Boolean; iOpacityPct: Byte): Integer;
      - WizardForm.CreateFormFromBmpBuffer(const Buffer: PAnsiChar; const Count: Cardinal; bACPremultiplied, bDraggableForm: Boolean; iOpacityPct: Byte): Integer;
  
      - WizardForm.JumpToPage(const NewPageID: Integer);

  - UninstallProgressForm:
      - UninstallProgressForm.DoubleBuffered: Boolean;
Code:
* Added Preprocessor (ISPP) Predefined Variable:
    - IS_PRIVATE_EDITION

* New Built-in Support for Partially Encrypted Scripts:
  - Ability to encrypt portions of the code for sharing scripts, 
    while leaving the rest as plain text.
  - I already explained what partially encrypted scripts mean here.

* Changes:
  - IDE:
    - Minor syntax highlighting adjustments.

* All the changes in the Private Edition are documented, so you can easily find help.



InnoSetup - Private Edition Documentation
  • InnoSetup Private Edition is based on v6.4.0-dev, the latest version available on GitHub.
  • Ensure that the following lines remain in the script to guarantee the use of the Private Edition:
Code:
#ifndef IS_PRIVATE_EDITION
  #error   InnoSetup 'Private Edition' is required to compile this script
#endif
Setup Directives

1). Cursor
  • The cursor can be applied to specific forms such as `SelectLanguageForm`, `WizardForm`, `SelectFolderForm`, and `NewDiskForm`.
  • Supported cursor file types: `.cur` and `.ani`.
Code:
[Setup]
Cursor=.\Cursor\Dark.Ani
2). ResourceFiles and Extracting Files to Buffer
  • The Private Edition allows storing files in resources, encrypting them internally so they cannot be extracted outside the `setup.exe`.
  • Multiple files can be included, separated by the pipe (`|`) symbol.
  • When using the extraction functions, prepend the resource name with `_IS_`.
Code:
function ExtractResourceFile(const ResourceName: string; const OutFile: string): Boolean;
function ExtractResourceFileSize(const ResourceName: string): Cardinal;
function ExtractResourceFileToBuffer(const ResourceName: string; Buffer: Integer): Boolean;
function ExtractResourceFileToStream(const BaseName: string; const Stream: TStream): Boolean;
Code:
[Setup]
ResourceFiles=Resource1:".\File1.ext"|Resource2:".\File2.ext"
  • Additional Functions:
Code:
procedure ExtractTemporaryFileEx(const BaseName: string; const DestDir: string);
function ExtractTemporaryFilesEx(const Pattern: string; const DestDir: string): Integer;
function ExtractTemporaryFileSize(const BaseName: string): Cardinal;
function ExtractTemporaryFileToBuffer(const BaseName: string; Buffer: Integer): Boolean;
function ExtractTemporaryFileToStream(const BaseName: string; const Stream: TStream): Boolean;

  • Example: Playing Music from Memory

* Using `ExtractTemporaryFile`:
Code:
[Files]
Source: ".\XBass\{#MusicFileOnly}"; DestDir: {tmp}; Flags: dontcopy;

[Code}
procedure InitializeWizard();
var
  Buffer: AnsiString;
  Count: Cardinal;
begin
  Count := ExtractTemporaryFileSize('{#MusicFileOnly}');
  SetLength(Buffer, Count);
  ExtractTemporaryFileToBuffer('{#MusicFileOnly}', CastAnsiStringToInteger(Buffer));
  
  if not xbassCreateFromMem(WizardForm.Handle,
                            Buffer, Count, C_XBASS_OGG,
                            1, True, @MusicCallback) then
    MsgBox('XBass - error(s) occured while creating.', mbError, MB_OK);

  SetLength(Buffer, 0);
end;
* Using `ExtractResourceFile`:
Code:
[Setup]
ResourceFiles=MusicX:".\XBass\{#MusicFileOnly}"

[Code}
procedure InitializeWizard();
var
  Buffer: AnsiString;
  Count: Cardinal;
begin
  // InnoSetup-Private:  ( Don't forget the prefix: "_IS_" )
  Count := ExtractResourceFileSize('_IS_MUSICX');
  SetLength(Buffer, Count);
  ExtractResourceFileToBuffer('_IS_MUSICX', CastAnsiStringToInteger(Buffer));

  if not xbassCreateFromMem(WizardForm.Handle,
                            Buffer, Count, C_XBASS_OGG,
                            1, True, @MusicCallback) then
    MsgBox('XBass - error(s) occured while creating.', mbError, MB_OK);

  SetLength(Buffer, 0);
end;
3. StorePrivateKey
  • The `StorePrivateKey` directive securely stores the encryption key within the setup, preventing exposure of the key in plain text.
  • The key can be retrieved dynamically at runtime using the `GetStoredPrivateKey` function, protecting it from reverse engineering.
Code:
[Setup]
// Encryption
Encryption=True
Password=HelloPwd_123
StorePrivateKey=HelloPwd_123
//

[Code}
var
  IsPwdPg: Boolean;
  
// function GetStoredPrivateKey(const TheRealKey: Boolean): String;
//  - TheRealKey: If False, the function returns garbage instead of real key.

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpPassword then
  begin
    IsPwdPg := True;
    WizardForm.PasswordEdit.Text := GetStoredPrivateKey(IsPwdPg);   
  end else
  begin
    IsPwdPg := False;
    WizardForm.PasswordEdit.Text := 'wrng_pwd';  
  end;  
end;
4. StyleFile
  • The `StyleFile` directive allows you to apply a VCL style to various forms during setup.
Code:
[Setup]
StyleFile=".\Styles\AquaGraphite.vsf"
5. Other Directives
Code:
[Setup]
EnableTaskbarPreview=True
// 0 - 255
AlphaBlendValue=200
Installation Progress Tracking and Controls
  • The Private Edition introduces a new event to track installation progress with elapsed time, remaining time, and percentage progress. It also supports `Pause`/`Resume` functionality.
Code:
procedure CurInstallProgressChangedEx(CurProgress, MaxProgress, iPercentage: Integer; 
  sElapsed, sRemaining: String);
begin    
  WzdProgressLbs[1].Vl.Caption := IntToStr(iPercentage) + '%'; 
  WzdProgressLbs[2].Vl.Caption := sElapsed; 
  WzdProgressLbs[3].Vl.Caption := sRemaining; 
  WzdProgressLbs[4].Vl.Caption := sElapsed;
end;
Page Navigation with `JumpToPage`
  • The `JumpToPage` method allows you to jump directly to specific pages in the setup process, bypassing validation checks like license acceptance. Use it cautiously.
Code:
[Code}
var
  Btn: array [1..2] of TNewButton;

procedure CommonBtnOnClick(Sender: TObject);
begin
  case Sender of
    Btn[1] : WizardForm.JumpToPage(wpWelcome);
    Btn[2] : WizardForm.JumpToPage(wpReady);
  end;
end;
  • - A new event function, `InitializeWizardEve`, triggers after `InitializeWizard` but before `WizardForm` is shown. It can be used to jump to specific pages at startup.
Code:
procedure InitializeWizardEve();
begin
  WizardForm.JumpToPage(wpReady);
end;
Special Effects and Graphics

1). TImgSlideshow
Code:
[Files]
Source: ".\Wallpapers\*.jpg"; DestDir: "{tmp}"; Flags: dontcopy;

[Code}
var
  ImgSlideshow: TImgSlideshow;
  
procedure InitializeWizard();
var
  sFile: String;
  ImgEffectsArray: TIntEffectArray;
  Buffer: AnsiString;
  i, Count: Cardinal;
begin  
  SetLength(ImgEffectsArray, 3);
  ImgEffectsArray[0] := IMG_ANIM_RANDOM_SQUARES_APPEAR;
  ImgEffectsArray[1] := IMG_ANIM_SPECKLE_APPEAR_FROM_LEFT;
  ImgEffectsArray[2] := IMG_ANIM_SPIRAL_RECTANGLE;
   
  ImgSlideshow := TImgSlideshow.Create(WizardForm, IMG_ANIM_DIAGONAL_BOX_OUT);
  ImgSlideshow.SetBounds(0, 0, WizardForm.Width + ScaleX(85), ScaleY(269));
  ImgSlideshow.PlayCustom(ImgEffectsArray, False);
  ImgSlideshow.Interval(1000, 50, 5);
  
  for i:= 1 to 5 do            
  begin
    sFile := 'wallpapers' + IntToStr(i) + '.jpg';
    
    Count := ExtractTemporaryFileSize(sFile);
    SetLength(Buffer, Count);
    ExtractTemporaryFileToBuffer(sFile, CastAnsiStringToInteger(Buffer));

    ImgSlideshow.AddImageFromBuffer(Buffer, Count);
    
    SetLength(Buffer, 0);
    Count := 0;
  end;
  
  ImgSlideshow.Start(True); 
end;
2). TSplashImage and TSplashImageAnimated
Code:
[Setup]
ResourceFiles=SplshImg:".\Splash\Splash.png"|SplshWav:".\Splash\Splash.wav"

[Code}
var
  SplashScreen: TSplashImage;

procedure InitializeWizard();
var 
  Buffer1, Buffer2: AnsiString;
  Count1, Count2: Cardinal;
begin
    // Image
  Count1 := ExtractResourceFileSize('_IS_SplshImg');
  SetLength(Buffer1, Count1);              
  ExtractResourceFileToBuffer('_IS_SplshImg', CastAnsiStringToInteger(Buffer1));
  
    // Sound
  Count2 := ExtractResourceFileSize('_IS_SplshWav');
  SetLength(Buffer2, Count2);
  ExtractResourceFileToBuffer('_IS_SplshWav', CastAnsiStringToInteger(Buffer2));

  SplashScreen := TSplashImage.CreateFromBuffer(WizardForm, Buffer1, Count1, Buffer2, Count2, 1500);
  SplashScreen.Play;
  
    // Freeup
  SetLength(Buffer1, 0); 
  SetLength(Buffer2, 0);  
end;
3). TWaterRipples
Code:
[Setup]
ResourceFiles=Img1:".\WaterRipple\Img.bmp"

[Code}
var
  WaterRipples: TWaterRipples;
  
procedure InitializeWizard();
var
  Buffer: AnsiString;
  Count: Cardinal;
begin  
  WizardForm.DoubleBuffered := True;

  Count := ExtractResourceFileSize('_IS_Img1');
  SetLength(Buffer, Count);
  ExtractResourceFileToBuffer('_IS_Img1', CastAnsiStringToInteger(Buffer));
    
  WaterRipples := TWaterRipples.CreateFromBuffer(WizardForm, 0, 0, 
    WizardForm.Width + ScaleX(85), ScaleY(269), Buffer, Count); 
  if not WaterRipples.IsStarted then  
    WaterRipples.Start;
  if not WaterRipples.IsRaining then
    WaterRipples.StartRainDrops;
  
  SetLength(Buffer, 0);
end;
Advanced Features

1). Blend OnMove
Code:
procedure InitializeWizard();
begin
  WizardForm.BlendOnMoveEnable(True);
end;
2). Create Form from BMP
Code:
[Files]
Source: ".\MaskImg\*.bmp"; DestDir: {tmp}; Flags: dontcopy;

[Code}
procedure InitializeWizard();
var
  Buffer: AnsiString;
  Count: Cardinal;
begin
  { Custom Shape }
    // Rgn
  Count := ExtractTemporaryFileSize('mask.bmp');
  SetLength(Buffer, Count);
  ExtractTemporaryFileToBuffer('mask.bmp', CastAnsiStringToInteger(Buffer));
  
  WizardForm.CreateRgnFromBuffer(Buffer, Count, clBlack);  
  SetLength(Buffer, 0);
  
    // Form
  Count := ExtractTemporaryFileSize('base.bmp');
  SetLength(Buffer, Count);
  ExtractTemporaryFileToBuffer('base.bmp', CastAnsiStringToInteger(Buffer));
  
  WizardForm.CreateFormFromBmpBuffer(Buffer, Count, False, True, 100);
  SetLength(Buffer, 0);
end;


.
Attached Images
File Type: png 0.png (31.9 KB, 145 views)
File Type: png 0a.png (16.1 KB, 141 views)
File Type: png 0b.png (18.1 KB, 142 views)
File Type: png 0c.png (45.1 KB, 138 views)
File Type: png 0d.png (74.0 KB, 138 views)
File Type: png 0e.png (14.6 KB, 136 views)
File Type: png 0f.png (27.0 KB, 140 views)
File Type: png 0g.png (29.8 KB, 139 views)
File Type: png 0h.png (28.4 KB, 142 views)
File Type: gif 01.gif (417.1 KB, 142 views)
File Type: gif 02.gif (249.0 KB, 133 views)
Attached Files
File Type: rar Setup - Innosetup-v6.4.0-dev-Private-Edition.rar (12.97 MB, 53 views)
File Type: rar Portable - InnoSetup-v6.4.0-dev-Private-Edition.rar (11.58 MB, 73 views)
Reply With Quote
The Following 10 Users Say Thank You to BLACKFIRE69 For This Useful Post:
audiofeel (19-09-2024), Behnam2018 (28-09-2024), Cesar82 (13-09-2024), Ele (17-09-2024), hitman797 (24-09-2024), Lord.Freddy (13-09-2024), mausschieber (13-09-2024), ScOOt3r (13-09-2024), shazzla (14-09-2024), Valtus (14-09-2024)
Sponsored Links
  #2  
Old 13-09-2024, 14:23
Cesar82's Avatar
Cesar82 Cesar82 is offline
Registered User
 
Join Date: May 2011
Location: Brazil
Posts: 1,016
Thanks: 1,721
Thanked 2,178 Times in 741 Posts
Cesar82 is on a distinguished road
Great project. Thanks!
However, what everyone needs is an improved IDE interface with code completion like the one in version 5.5.1 ENHANCED by RESTOOL and also including all the additional classes.

In fact, it would be great to have a remake of version 5.5.1ee2 updated to the current version but without a different IDE, just complementing the official IDE with extra features.
I believe if this remake were done, a large number of people would start using it, because I think that until today the RESTOOL version is the most used among the modified versions of Inno Setup.
Reply With Quote
The Following 5 Users Say Thank You to Cesar82 For This Useful Post:
Dario06 (26-09-2024), Fak Eid (15-09-2024), Lord.Freddy (14-09-2024), mausschieber (13-09-2024), Tihiy_Don (13-09-2024)
  #3  
Old 15-09-2024, 02:12
demon964 demon964 is offline
Registered User
 
Join Date: Feb 2014
Location: Azerbaijan
Posts: 30
Thanks: 1
Thanked 6 Times in 4 Posts
demon964 is on a distinguished road
3. StorePrivateKey

its protecting script codes from decompile ?
Reply With Quote
  #4  
Old 26-09-2024, 12:51
Dario06 Dario06 is offline
Registered User
 
Join Date: Sep 2024
Location: Betelgeuse
Posts: 22
Thanks: 7
Thanked 12 Times in 7 Posts
Dario06 is on a distinguished road
Thumbs up

for me the ee2 version doesn't beat the interface, too bad it's old, I can't even read this one, it looks like a rainbow of colors in the code and very dull, you need an oled monitor to read

you could add this option like in the screenshot like nsis, it would be an orgasm
Thanks mr. blackfire
Attached Images
File Type: png Screenshot_1.png (22.2 KB, 28 views)

Last edited by Dario06; 29-09-2024 at 05:51.
Reply With Quote
The Following 2 Users Say Thank You to Dario06 For This Useful Post:
Behnam2018 (27-09-2024), Cesar82 (27-09-2024)
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Best Compression Methods for 'Specific' Games INDEX JustFun Conversion Tutorials 44 27-09-2024 11:24
INDEX - CD2DVD Conversion Index **UPDATED: 17-07-2024** Grumpy PC Games - CD/DVD Conversions 252 16-07-2024 20:35
Fallout Nv Ultimate Edition 3xDVD9 to 2xDVD5 InnoSetup 1 LANGUAGE THADEADMAN2011 PC Games - CD/DVD Conversions 9 04-09-2022 05:40



All times are GMT -7. The time now is 20:10.


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