View Single Post
  #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: 692
Thanks: 481
Thanked 2,561 Times in 565 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, 472 views)
File Type: png 0a.png (16.1 KB, 462 views)
File Type: png 0b.png (18.1 KB, 459 views)
File Type: png 0c.png (45.1 KB, 455 views)
File Type: png 0d.png (74.0 KB, 452 views)
File Type: png 0e.png (14.6 KB, 439 views)
File Type: png 0f.png (27.0 KB, 445 views)
File Type: png 0g.png (29.8 KB, 456 views)
File Type: png 0h.png (28.4 KB, 447 views)
File Type: gif 01.gif (417.1 KB, 458 views)
File Type: gif 02.gif (249.0 KB, 439 views)
Attached Files
File Type: rar Setup - Innosetup-v6.4.0-dev-Private-Edition.rar (12.97 MB, 147 views)
File Type: rar Portable - InnoSetup-v6.4.0-dev-Private-Edition.rar (11.58 MB, 186 views)
Reply With Quote
The Following 15 Users Say Thank You to BLACKFIRE69 For This Useful Post:
Aschenputtell (22-03-2025), audiofeel (19-09-2024), Behnam2018 (28-09-2024), Carldric Clement (24-11-2025), Cesar82 (13-09-2024), Ele (17-09-2024), hitman797 (24-09-2024), Jawahir95 (31-08-2025), Lord.Freddy (13-09-2024), mausschieber (13-09-2024), nordi (25-10-2024), ScOOt3r (13-09-2024), shazzla (14-09-2024), Valtus (14-09-2024), Wanterlude (25-04-2025)
Sponsored Links