|
@@ -32,26 +32,141 @@ uses
|
|
Shared.DotNetVersion, Setup.MsiFunc, Compression.SevenZipDecoder,
|
|
Shared.DotNetVersion, Setup.MsiFunc, Compression.SevenZipDecoder,
|
|
Setup.DebugClient;
|
|
Setup.DebugClient;
|
|
|
|
|
|
-var
|
|
|
|
- ScaleBaseUnitsInitialized: Boolean;
|
|
|
|
- ScaleBaseUnitX, ScaleBaseUnitY: Integer;
|
|
|
|
|
|
+type
|
|
|
|
+ TPSStackHelper = class helper for TPSStack
|
|
|
|
+ private
|
|
|
|
+ function GetArray(const ItemNo, FieldNo: Longint; out N: Integer): TPSVariantIFC;
|
|
|
|
+ function SetArray(const ItemNo, FieldNo: Longint; const N: Integer): TPSVariantIFC; overload;
|
|
|
|
+ public
|
|
|
|
+ type
|
|
|
|
+ TArrayOfInteger = array of Integer;
|
|
|
|
+ TArrayOfString = array of String;
|
|
|
|
+ TArrayBuilder = record
|
|
|
|
+ Arr: TPSVariantIFC;
|
|
|
|
+ I: Integer;
|
|
|
|
+ procedure Add(const Data: String);
|
|
|
|
+ end;
|
|
|
|
+ TArrayEnumerator = record
|
|
|
|
+ Arr: TPSVariantIFC;
|
|
|
|
+ N, I: Integer;
|
|
|
|
+ function HasNext: Boolean;
|
|
|
|
+ function Next: String;
|
|
|
|
+ end;
|
|
|
|
+ function GetIntArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfInteger;
|
|
|
|
+ function GetProc(const ItemNo: Longint; const Exec: TPSExec): TMethod;
|
|
|
|
+ function GetStringArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfString;
|
|
|
|
+ function InitArrayBuilder(const ItemNo: LongInt; const FieldNo: Longint = -1): TArrayBuilder;
|
|
|
|
+ function InitArrayEnumerator(const ItemNo: LongInt; const FieldNo: Longint = -1): TArrayEnumerator;
|
|
|
|
+ procedure SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint = -1); overload;
|
|
|
|
+ procedure SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint = -1); overload;
|
|
|
|
+ procedure SetInt(const ItemNo: Longint; const Data: Integer; const FieldNo: Longint = -1);
|
|
|
|
+ end;
|
|
|
|
|
|
-procedure NoSetupFuncError(const C: AnsiString); overload;
|
|
|
|
|
|
+function TPSStackHelper.GetArray(const ItemNo, FieldNo: Longint;
|
|
|
|
+ out N: Integer): TPSVariantIFC;
|
|
begin
|
|
begin
|
|
- InternalError(Format('Cannot call "%s" function during Setup', [C]));
|
|
|
|
|
|
+ if FieldNo >= 0 then
|
|
|
|
+ Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
|
|
|
|
+ else
|
|
|
|
+ Result := NewTPSVariantIFC(Items[ItemNo], True);
|
|
|
|
+ N := PSDynArrayGetLength(Pointer(Result.Dta^), Result.aType);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure NoUninstallFuncError(const C: AnsiString); overload;
|
|
|
|
|
|
+function TPSStackHelper.SetArray(const ItemNo, FieldNo: Longint;
|
|
|
|
+ const N: Integer): TPSVariantIFC;
|
|
begin
|
|
begin
|
|
- InternalError(Format('Cannot call "%s" function during Uninstall', [C]));
|
|
|
|
|
|
+ if FieldNo >= 0 then
|
|
|
|
+ Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
|
|
|
|
+ else
|
|
|
|
+ Result := NewTPSVariantIFC(Items[ItemNo], True);
|
|
|
|
+ PSDynArraySetLength(Pointer(Result.Dta^), Result.aType, N);
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure NoSetupFuncError(const C: UnicodeString); overload;
|
|
|
|
|
|
+function TPSStackHelper.GetIntArray(const ItemNo, FieldNo: Longint): TArrayOfInteger;
|
|
begin
|
|
begin
|
|
- InternalError(Format('Cannot call "%s" function during Setup', [C]));
|
|
|
|
|
|
+ var N: Integer;
|
|
|
|
+ var Arr := GetArray(ItemNo, FieldNo, N);
|
|
|
|
+ SetLength(Result, N);
|
|
|
|
+ for var I := 0 to N-1 do
|
|
|
|
+ Result[I] := VNGetInt(PSGetArrayField(Arr, I));
|
|
end;
|
|
end;
|
|
|
|
|
|
-procedure NoUninstallFuncError(const C: UnicodeString); overload;
|
|
|
|
|
|
+function TPSStackHelper.GetProc(const ItemNo: Longint; const Exec: TPSExec): TMethod;
|
|
|
|
+begin
|
|
|
|
+ var P := PPSVariantProcPtr(Items[ItemNo]);
|
|
|
|
+ { ProcNo 0 means nil was passed by the script and GetProcAsMethod will then return a (nil, nil) TMethod }
|
|
|
|
+ Result := Exec.GetProcAsMethod(P.ProcNo);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPSStackHelper.GetStringArray(const ItemNo, FieldNo: Longint): TArrayOfString;
|
|
|
|
+begin
|
|
|
|
+ var N: Integer;
|
|
|
|
+ var Arr := GetArray(ItemNo, FieldNo, N);
|
|
|
|
+ SetLength(Result, N);
|
|
|
|
+ for var I := 0 to N-1 do
|
|
|
|
+ Result[I] := VNGetString(PSGetArrayField(Arr, I));
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPSStackHelper.InitArrayBuilder(const ItemNo, FieldNo: Longint): TArrayBuilder;
|
|
|
|
+begin
|
|
|
|
+ Result.Arr := SetArray(ItemNo, FieldNo, 0);
|
|
|
|
+ Result.I := 0;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TPSStackHelper.TArrayBuilder.Add(const Data: String);
|
|
|
|
+begin
|
|
|
|
+ PSDynArraySetLength(Pointer(Arr.Dta^), Arr.aType, I+1);
|
|
|
|
+ VNSetString(PSGetArrayField(Arr, I), Data);
|
|
|
|
+ Inc(I);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPSStackHelper.InitArrayEnumerator(const ItemNo, FieldNo: Longint): TArrayEnumerator;
|
|
|
|
+begin
|
|
|
|
+ Result.Arr := GetArray(ItemNo, FieldNo, Result.N);
|
|
|
|
+ Result.I := 0;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPSStackHelper.TArrayEnumerator.HasNext: Boolean;
|
|
|
|
+begin
|
|
|
|
+ Result := I < N;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+function TPSStackHelper.TArrayEnumerator.Next: String;
|
|
|
|
+begin
|
|
|
|
+ Result := VNGetString(PSGetArrayField(Arr, I));
|
|
|
|
+ Inc(I);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint);
|
|
|
|
+begin
|
|
|
|
+ var N := System.Length(Data);
|
|
|
|
+ var Arr := SetArray(ItemNo, FieldNo, N);
|
|
|
|
+ for var I := 0 to N-1 do
|
|
|
|
+ VNSetString(PSGetArrayField(Arr, I), Data[I]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint);
|
|
|
|
+begin
|
|
|
|
+ var N := Data.Count;
|
|
|
|
+ var Arr := SetArray(ItemNo, FieldNo, N);
|
|
|
|
+ for var I := 0 to N-1 do
|
|
|
|
+ VNSetString(PSGetArrayField(Arr, I), Data[I]);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+procedure TPSStackHelper.SetInt(const ItemNo: Longint; const Data: Integer;
|
|
|
|
+ const FieldNo: Longint);
|
|
|
|
+begin
|
|
|
|
+ if FieldNo = -1 then
|
|
|
|
+ inherited SetInt(ItemNo, Data)
|
|
|
|
+ else begin
|
|
|
|
+ var PSVariantIFC := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo);
|
|
|
|
+ VNSetInt(PSVariantIFC, Data);
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{---}
|
|
|
|
+
|
|
|
|
+procedure NoUninstallFuncError(const C: AnsiString); overload;
|
|
begin
|
|
begin
|
|
InternalError(Format('Cannot call "%s" function during Uninstall', [C]));
|
|
InternalError(Format('Cannot call "%s" function during Uninstall', [C]));
|
|
end;
|
|
end;
|
|
@@ -88,6 +203,10 @@ begin
|
|
Result := SetupMessages[ID];
|
|
Result := SetupMessages[ID];
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ScaleBaseUnitsInitialized: Boolean;
|
|
|
|
+ ScaleBaseUnitX, ScaleBaseUnitY: Integer;
|
|
|
|
+
|
|
procedure InitializeScaleBaseUnits;
|
|
procedure InitializeScaleBaseUnits;
|
|
var
|
|
var
|
|
Font: TFont;
|
|
Font: TFont;
|
|
@@ -114,8 +233,6 @@ begin
|
|
Result := False;
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
|
|
-{---}
|
|
|
|
-
|
|
|
|
type
|
|
type
|
|
{ *Must* keep this in synch with ScriptFunc_C }
|
|
{ *Must* keep this in synch with ScriptFunc_C }
|
|
TFindRec = record
|
|
TFindRec = record
|
|
@@ -183,7 +300,7 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
type
|
|
type
|
|
- { *Must* keep this in synch with ScriptFunc_C }
|
|
|
|
|
|
+ { *Must* keep this in synch with Compiler.ScriptFunc.pas }
|
|
TWindowsVersion = packed record
|
|
TWindowsVersion = packed record
|
|
Major: Cardinal;
|
|
Major: Cardinal;
|
|
Minor: Cardinal;
|
|
Minor: Cardinal;
|
|
@@ -207,142 +324,6 @@ begin
|
|
Version.SuiteMask := WindowsSuiteMask;
|
|
Version.SuiteMask := WindowsSuiteMask;
|
|
end;
|
|
end;
|
|
|
|
|
|
-{---}
|
|
|
|
-
|
|
|
|
-type
|
|
|
|
- TPSStackHelper = class helper for TPSStack
|
|
|
|
- private
|
|
|
|
- function GetArray(const ItemNo, FieldNo: Longint; out N: Integer): TPSVariantIFC;
|
|
|
|
- function SetArray(const ItemNo, FieldNo: Longint; const N: Integer): TPSVariantIFC; overload;
|
|
|
|
- public
|
|
|
|
- type
|
|
|
|
- TArrayOfInteger = array of Integer;
|
|
|
|
- TArrayOfString = array of String;
|
|
|
|
- TArrayBuilder = record
|
|
|
|
- Arr: TPSVariantIFC;
|
|
|
|
- I: Integer;
|
|
|
|
- procedure Add(const Data: String);
|
|
|
|
- end;
|
|
|
|
- TArrayEnumerator = record
|
|
|
|
- Arr: TPSVariantIFC;
|
|
|
|
- N, I: Integer;
|
|
|
|
- function HasNext: Boolean;
|
|
|
|
- function Next: String;
|
|
|
|
- end;
|
|
|
|
- function GetIntArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfInteger;
|
|
|
|
- function GetProc(const ItemNo: Longint; const Exec: TPSExec): TMethod;
|
|
|
|
- function GetStringArray(const ItemNo: Longint; const FieldNo: Longint = -1): TArrayOfString;
|
|
|
|
- function InitArrayBuilder(const ItemNo: LongInt; const FieldNo: Longint = -1): TArrayBuilder;
|
|
|
|
- function InitArrayEnumerator(const ItemNo: LongInt; const FieldNo: Longint = -1): TArrayEnumerator;
|
|
|
|
- procedure SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint = -1); overload;
|
|
|
|
- procedure SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint = -1); overload;
|
|
|
|
- procedure SetInt(const ItemNo: Longint; const Data: Integer; const FieldNo: Longint = -1);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.GetArray(const ItemNo, FieldNo: Longint;
|
|
|
|
- out N: Integer): TPSVariantIFC;
|
|
|
|
-begin
|
|
|
|
- if FieldNo >= 0 then
|
|
|
|
- Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
|
|
|
|
- else
|
|
|
|
- Result := NewTPSVariantIFC(Items[ItemNo], True);
|
|
|
|
- N := PSDynArrayGetLength(Pointer(Result.Dta^), Result.aType);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.SetArray(const ItemNo, FieldNo: Longint;
|
|
|
|
- const N: Integer): TPSVariantIFC;
|
|
|
|
-begin
|
|
|
|
- if FieldNo >= 0 then
|
|
|
|
- Result := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo)
|
|
|
|
- else
|
|
|
|
- Result := NewTPSVariantIFC(Items[ItemNo], True);
|
|
|
|
- PSDynArraySetLength(Pointer(Result.Dta^), Result.aType, N);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.GetIntArray(const ItemNo, FieldNo: Longint): TArrayOfInteger;
|
|
|
|
-begin
|
|
|
|
- var N: Integer;
|
|
|
|
- var Arr := GetArray(ItemNo, FieldNo, N);
|
|
|
|
- SetLength(Result, N);
|
|
|
|
- for var I := 0 to N-1 do
|
|
|
|
- Result[I] := VNGetInt(PSGetArrayField(Arr, I));
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.GetProc(const ItemNo: Longint; const Exec: TPSExec): TMethod;
|
|
|
|
-begin
|
|
|
|
- var P := PPSVariantProcPtr(Items[ItemNo]);
|
|
|
|
- { ProcNo 0 means nil was passed by the script and GetProcAsMethod will then return a (nil, nil) TMethod }
|
|
|
|
- Result := Exec.GetProcAsMethod(P.ProcNo);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.GetStringArray(const ItemNo, FieldNo: Longint): TArrayOfString;
|
|
|
|
-begin
|
|
|
|
- var N: Integer;
|
|
|
|
- var Arr := GetArray(ItemNo, FieldNo, N);
|
|
|
|
- SetLength(Result, N);
|
|
|
|
- for var I := 0 to N-1 do
|
|
|
|
- Result[I] := VNGetString(PSGetArrayField(Arr, I));
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.InitArrayBuilder(const ItemNo, FieldNo: Longint): TArrayBuilder;
|
|
|
|
-begin
|
|
|
|
- Result.Arr := SetArray(ItemNo, FieldNo, 0);
|
|
|
|
- Result.I := 0;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-procedure TPSStackHelper.TArrayBuilder.Add(const Data: String);
|
|
|
|
-begin
|
|
|
|
- PSDynArraySetLength(Pointer(Arr.Dta^), Arr.aType, I+1);
|
|
|
|
- VNSetString(PSGetArrayField(Arr, I), Data);
|
|
|
|
- Inc(I);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.InitArrayEnumerator(const ItemNo, FieldNo: Longint): TArrayEnumerator;
|
|
|
|
-begin
|
|
|
|
- Result.Arr := GetArray(ItemNo, FieldNo, Result.N);
|
|
|
|
- Result.I := 0;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.TArrayEnumerator.HasNext: Boolean;
|
|
|
|
-begin
|
|
|
|
- Result := I < N;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-function TPSStackHelper.TArrayEnumerator.Next: String;
|
|
|
|
-begin
|
|
|
|
- Result := VNGetString(PSGetArrayField(Arr, I));
|
|
|
|
- Inc(I);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TArray<String>; const FieldNo: Longint);
|
|
|
|
-begin
|
|
|
|
- var N := System.Length(Data);
|
|
|
|
- var Arr := SetArray(ItemNo, FieldNo, N);
|
|
|
|
- for var I := 0 to N-1 do
|
|
|
|
- VNSetString(PSGetArrayField(Arr, I), Data[I]);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-procedure TPSStackHelper.SetArray(const ItemNo: Longint; const Data: TStrings; const FieldNo: Longint);
|
|
|
|
-begin
|
|
|
|
- var N := Data.Count;
|
|
|
|
- var Arr := SetArray(ItemNo, FieldNo, N);
|
|
|
|
- for var I := 0 to N-1 do
|
|
|
|
- VNSetString(PSGetArrayField(Arr, I), Data[I]);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-procedure TPSStackHelper.SetInt(const ItemNo: Longint; const Data: Integer;
|
|
|
|
- const FieldNo: Longint);
|
|
|
|
-begin
|
|
|
|
- if FieldNo = -1 then
|
|
|
|
- inherited SetInt(ItemNo, Data)
|
|
|
|
- else begin
|
|
|
|
- var PSVariantIFC := NewTPSVariantRecordIFC(Items[ItemNo], FieldNo);
|
|
|
|
- VNSetInt(PSVariantIFC, Data);
|
|
|
|
- end;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-{---}
|
|
|
|
-
|
|
|
|
procedure CrackCodeRootKey(CodeRootKey: HKEY; var RegView: TRegView;
|
|
procedure CrackCodeRootKey(CodeRootKey: HKEY; var RegView: TRegView;
|
|
var RootKey: HKEY);
|
|
var RootKey: HKEY);
|
|
begin
|
|
begin
|
|
@@ -812,16 +793,37 @@ end;
|
|
|
|
|
|
type
|
|
type
|
|
TScriptFunc = reference to procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal);
|
|
TScriptFunc = reference to procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal);
|
|
- TScriptFuncs = TDictionary<AnsiString, TScriptFunc>;
|
|
|
|
|
|
+ TScriptFuncTyp = (sfNormal, sfNoUninstall, sfOnlyUninstall);
|
|
|
|
+ TScriptFuncEx = record
|
|
|
|
+ OrgName: AnsiString;
|
|
|
|
+ ScriptFunc: TScriptFunc;
|
|
|
|
+ Typ: TScriptFuncTyp;
|
|
|
|
+ constructor Create(const AOrgName: AnsiString; const AScriptFunc: TScriptFunc; const ATyp: TScriptFuncTyp);
|
|
|
|
+ end;
|
|
|
|
+ TScriptFuncs = TDictionary<AnsiString, TScriptFuncEx>;
|
|
|
|
+
|
|
var
|
|
var
|
|
ScriptFuncs: TScriptFuncs;
|
|
ScriptFuncs: TScriptFuncs;
|
|
|
|
|
|
|
|
+constructor TScriptFuncEx.Create(const AOrgName: AnsiString; const AScriptFunc: TScriptFunc; const ATyp: TScriptFuncTyp);
|
|
|
|
+begin
|
|
|
|
+ OrgName := AOrgName;
|
|
|
|
+ ScriptFunc := AScriptFunc;
|
|
|
|
+ Typ := ATyp;
|
|
|
|
+end;
|
|
|
|
+
|
|
function ScriptFuncPSProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
|
|
function ScriptFuncPSProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
|
|
begin
|
|
begin
|
|
- var ScriptFunc: TScriptFunc;
|
|
|
|
- Result := ScriptFuncs.TryGetValue(Proc.Name, ScriptFunc);
|
|
|
|
- if Result then
|
|
|
|
- ScriptFunc(Caller, Proc.Name, Stack, Stack.Count-1);
|
|
|
|
|
|
+ var ScriptFuncEx: TScriptFuncEx;
|
|
|
|
+ Result := ScriptFuncs.TryGetValue(Proc.Name, ScriptFuncEx);
|
|
|
|
+ if Result then begin
|
|
|
|
+ if (ScriptFuncEx.Typ = sfNoUninstall) and IsUninstaller then
|
|
|
|
+ NoUninstallFuncError(Proc.Name)
|
|
|
|
+ else if (ScriptFuncEx.Typ = sfOnlyUninstall) and not IsUninstaller then
|
|
|
|
+ InternalError(Format('Cannot call "%s" function during Setup', [ScriptFuncEx.OrgName]))
|
|
|
|
+ else
|
|
|
|
+ ScriptFuncEx.ScriptFunc(Caller, Proc.Name, Stack, Stack.Count-1);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure ScriptFuncLibraryRegister_R(ScriptInterpreter: TPSExec);
|
|
procedure ScriptFuncLibraryRegister_R(ScriptInterpreter: TPSExec);
|
|
@@ -830,15 +832,21 @@ var
|
|
Count: Integer;
|
|
Count: Integer;
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
|
|
- procedure RegisterScriptFunc(const Name: AnsiString; const ScriptFunc: TScriptFunc); overload;
|
|
|
|
|
|
+ procedure RegisterScriptFunc(const Name: AnsiString; const ScriptFuncTyp: TScriptFuncTyp; const ScriptFunc: TScriptFunc); overload;
|
|
begin
|
|
begin
|
|
- ScriptFuncs.Add(FastUpperCase(Name), ScriptFunc);
|
|
|
|
|
|
+ var ScriptFuncEx: TScriptFuncEx;
|
|
|
|
+ ScriptFuncs.Add(FastUpperCase(Name), TScriptFuncEx.Create(Name, ScriptFunc, ScriptFuncTyp));
|
|
ScriptInterpreter.RegisterFunctionName(Name, ScriptFuncPSProc, nil, nil);
|
|
ScriptInterpreter.RegisterFunctionName(Name, ScriptFuncPSProc, nil, nil);
|
|
{$IFDEF DEBUG}
|
|
{$IFDEF DEBUG}
|
|
Inc(Count);
|
|
Inc(Count);
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ procedure RegisterScriptFunc(const Name: AnsiString; const ScriptFunc: TScriptFunc); overload;
|
|
|
|
+ begin
|
|
|
|
+ RegisterScriptFunc(Name, sfNormal, ScriptFunc);
|
|
|
|
+ end;
|
|
|
|
+
|
|
procedure RegisterScriptFunc(const Names: array of AnsiString; const ScriptFunc: TScriptFunc); overload;
|
|
procedure RegisterScriptFunc(const Names: array of AnsiString; const ScriptFunc: TScriptFunc); overload;
|
|
begin
|
|
begin
|
|
for var Name in Names do
|
|
for var Name in Names do
|
|
@@ -847,22 +855,16 @@ var
|
|
|
|
|
|
procedure RegisterScriptDlgScriptFuncs;
|
|
procedure RegisterScriptDlgScriptFuncs;
|
|
begin
|
|
begin
|
|
- RegisterScriptFunc('PAGEFROMID', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('PageFromID', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
Stack.SetClass(PStart, GetWizardForm.PageFromID(Stack.GetInt(PStart-1)));
|
|
Stack.SetClass(PStart, GetWizardForm.PageFromID(Stack.GetInt(PStart-1)));
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('PAGEINDEXFROMID', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('PageIndexFromID', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
Stack.SetInt(PStart, GetWizardForm.PageIndexFromID(Stack.GetInt(PStart-1)));
|
|
Stack.SetInt(PStart, GetWizardForm.PageIndexFromID(Stack.GetInt(PStart-1)));
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATECUSTOMPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CreateCustomPage', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewPage := TWizardPage.Create(GetWizardForm);
|
|
var NewPage := TWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewPage.Caption := Stack.GetString(PStart-2);
|
|
NewPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -874,10 +876,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewPage);
|
|
Stack.SetClass(PStart, NewPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEINPUTQUERYPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CreateInputQueryPage', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewInputQueryPage := TInputQueryWizardPage.Create(GetWizardForm);
|
|
var NewInputQueryPage := TInputQueryWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewInputQueryPage.Caption := Stack.GetString(PStart-2);
|
|
NewInputQueryPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -890,10 +890,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewInputQueryPage);
|
|
Stack.SetClass(PStart, NewInputQueryPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEINPUTOPTIONPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CreateInputOptionPage', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewInputOptionPage := TInputOptionWizardPage.Create(GetWizardForm);
|
|
var NewInputOptionPage := TInputOptionWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewInputOptionPage.Caption := Stack.GetString(PStart-2);
|
|
NewInputOptionPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -907,10 +905,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewInputOptionPage);
|
|
Stack.SetClass(PStart, NewInputOptionPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEINPUTDIRPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEINPUTDIRPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewInputDirPage := TInputDirWizardPage.Create(GetWizardForm);
|
|
var NewInputDirPage := TInputDirWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewInputDirPage.Caption := Stack.GetString(PStart-2);
|
|
NewInputDirPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -924,10 +920,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewInputDirPage);
|
|
Stack.SetClass(PStart, NewInputDirPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEINPUTFILEPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEINPUTFILEPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewInputFilePage := TInputFileWizardPage.Create(GetWizardForm);
|
|
var NewInputFilePage := TInputFileWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewInputFilePage.Caption := Stack.GetString(PStart-2);
|
|
NewInputFilePage.Caption := Stack.GetString(PStart-2);
|
|
@@ -940,10 +934,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewInputFilePage);
|
|
Stack.SetClass(PStart, NewInputFilePage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEOUTPUTMSGPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEOUTPUTMSGPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewOutputMsgPage := TOutputMsgWizardPage.Create(GetWizardForm);
|
|
var NewOutputMsgPage := TOutputMsgWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewOutputMsgPage.Caption := Stack.GetString(PStart-2);
|
|
NewOutputMsgPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -956,10 +948,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewOutputMsgPage);
|
|
Stack.SetClass(PStart, NewOutputMsgPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEOUTPUTMSGMEMOPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEOUTPUTMSGMEMOPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewOutputMsgMemoPage := TOutputMsgMemoWizardPage.Create(GetWizardForm);
|
|
var NewOutputMsgMemoPage := TOutputMsgMemoWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewOutputMsgMemoPage.Caption := Stack.GetString(PStart-2);
|
|
NewOutputMsgMemoPage.Caption := Stack.GetString(PStart-2);
|
|
@@ -973,10 +963,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewOutputMsgMemoPage);
|
|
Stack.SetClass(PStart, NewOutputMsgMemoPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEOUTPUTPROGRESSPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEOUTPUTPROGRESSPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewOutputProgressPage := TOutputProgressWizardPage.Create(GetWizardForm);
|
|
var NewOutputProgressPage := TOutputProgressWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewOutputProgressPage.Caption := Stack.GetString(PStart-1);
|
|
NewOutputProgressPage.Caption := Stack.GetString(PStart-1);
|
|
@@ -989,10 +977,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewOutputProgressPage);
|
|
Stack.SetClass(PStart, NewOutputProgressPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEOUTPUTMARQUEEPROGRESSPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEOUTPUTMARQUEEPROGRESSPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewOutputMarqueeProgressPage := TOutputMarqueeProgressWizardPage.Create(GetWizardForm);
|
|
var NewOutputMarqueeProgressPage := TOutputMarqueeProgressWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewOutputMarqueeProgressPage.Caption := Stack.GetString(PStart-1);
|
|
NewOutputMarqueeProgressPage.Caption := Stack.GetString(PStart-1);
|
|
@@ -1005,10 +991,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewOutputMarqueeProgressPage);
|
|
Stack.SetClass(PStart, NewOutputMarqueeProgressPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEDOWNLOADPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
- begin
|
|
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEDOWNLOADPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
+ begin;
|
|
var NewDownloadPage := TDownloadWizardPage.Create(GetWizardForm);
|
|
var NewDownloadPage := TDownloadWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewDownloadPage.Caption := Stack.GetString(PStart-1);
|
|
NewDownloadPage.Caption := Stack.GetString(PStart-1);
|
|
@@ -1022,10 +1006,8 @@ var
|
|
end;
|
|
end;
|
|
Stack.SetClass(PStart, NewDownloadPage);
|
|
Stack.SetClass(PStart, NewDownloadPage);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('CREATEEXTRACTIONPAGE', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('CREATEEXTRACTIONPAGE', sfNoUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if IsUninstaller then
|
|
|
|
- NoUninstallFuncError(Name);
|
|
|
|
var NewExtractionPage := TExtractionWizardPage.Create(GetWizardForm);
|
|
var NewExtractionPage := TExtractionWizardPage.Create(GetWizardForm);
|
|
try
|
|
try
|
|
NewExtractionPage.Caption := Stack.GetString(PStart-1);
|
|
NewExtractionPage.Caption := Stack.GetString(PStart-1);
|
|
@@ -2439,10 +2421,8 @@ var
|
|
begin
|
|
begin
|
|
Stack.SetBool(PStart, IsUninstaller);
|
|
Stack.SetBool(PStart, IsUninstaller);
|
|
end);
|
|
end);
|
|
- RegisterScriptFunc('UNINSTALLSILENT', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
|
|
|
|
+ RegisterScriptFunc('UninstallSilent', sfOnlyUninstall, procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
begin
|
|
begin
|
|
- if not IsUninstaller then
|
|
|
|
- NoSetupFuncError(Name);
|
|
|
|
Stack.SetBool(PStart, UninstallSilent);
|
|
Stack.SetBool(PStart, UninstallSilent);
|
|
end);
|
|
end);
|
|
RegisterScriptFunc('CURRENTFILENAME', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|
|
RegisterScriptFunc('CURRENTFILENAME', procedure(const Caller: TPSExec; const Name: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
|