BLACKFIRE69
Новичок
Форматирование (BB-код):
Project: InnoSetup - Private Edition
Based on: v6.4.0-dev (latest)
Changes by: BLACKFIRE69
Форматирование (BB-код):
* 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;
Форматирование (BB-код):
- Casting Type:
- 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;
- Installation Control:
- procedure BeginInstallProcPause;
- procedure EndInstallProcPause;
- function IsInstallProcPaused: Boolean;
Форматирование (BB-код):
- 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();
Форматирование (BB-код):
* Added Classes:
- TApplication
- TMemoryStream
- TResourceStream
- TImgSlideshow → SlideShow
- TSplashImage → SplashScreen
- TSplashImageAnimated → SplashScreenAnimated
- TWaterRipples → WaterRipples
* Added Class Variables:
- Application: TApplication
Форматирование (BB-код):
* 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;
Форматирование (BB-код):
* 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:
Форматирование (BB-код):
#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`.
Форматирование (BB-код):
[Setup]
Cursor=.\Cursor\Dark.Ani
- 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_ `.
Форматирование (BB-код):
[Setup]
ResourceFiles=Resource1:".\File1.ext"|Resource2:".\File2.ext"
Форматирование (BB-код):
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;
- Additional Functions:
Форматирование (BB-код):
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
Форматирование (BB-код):
[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;
Форматирование (BB-код):
[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;
- 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.
Форматирование (BB-код):
[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;
- The `StyleFile` directive allows you to apply a VCL style to various forms during setup.
Форматирование (BB-код):
[Setup]
StyleFile=".\Styles\AquaGraphite.vsf"
Форматирование (BB-код):
[Setup]
EnableTaskbarPreview=True
// 0 - 255
AlphaBlendValue=200
- 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.
Форматирование (BB-код):
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;
- The ` JumpToPage ` method allows you to jump directly to specific pages in the setup process, bypassing validation checks like license acceptance. Use it carefully.
Форматирование (BB-код):
[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.
Форматирование (BB-код):
procedure InitializeWizardEve();
begin
WizardForm.JumpToPage(wpReady);
end;
1).TImgSlideshow
Форматирование (BB-код):
[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;
Форматирование (BB-код):
[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;
Форматирование (BB-код):
[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;
1). Blend On Move
Форматирование (BB-код):
procedure InitializeWizard();
begin
WizardForm.BlendOnMoveEnable(True);
end;
Форматирование (BB-код):
[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;