259 lines
8.9 KiB
ObjectPascal
259 lines
8.9 KiB
ObjectPascal
program Compil32;
|
|
|
|
{
|
|
Inno Setup
|
|
Copyright (C) 1997-2024 Jordan Russell
|
|
Portions by Martijn Laan
|
|
For conditions of distribution and use, see LICENSE.TXT.
|
|
|
|
Compiler
|
|
}
|
|
|
|
uses
|
|
SafeDLLPath in '..\Components\SafeDLLPath.pas',
|
|
Windows,
|
|
SysUtils,
|
|
Forms,
|
|
PathFunc in '..\Components\PathFunc.pas',
|
|
TrustFunc in '..\Components\TrustFunc.pas',
|
|
IDE.MainForm in 'Src\IDE.MainForm.pas' {MainForm},
|
|
Shared.CommonFunc.Vcl in 'Src\Shared.CommonFunc.Vcl.pas',
|
|
Shared.CommonFunc in 'Src\Shared.CommonFunc.pas',
|
|
IDE.HelperFunc in 'Src\IDE.HelperFunc.pas',
|
|
IDE.Messages in 'Src\IDE.Messages.pas',
|
|
Shared.CompilerInt in 'Src\Shared.CompilerInt.pas',
|
|
Shared.CompilerInt.Struct in 'Src\Shared.CompilerInt.Struct.pas',
|
|
IDE.OptionsForm in 'Src\IDE.OptionsForm.pas' {OptionsForm},
|
|
IDE.StartupForm in 'Src\IDE.StartupForm.pas' {StartupForm},
|
|
IDE.Wizard.WizardForm in 'Src\IDE.Wizard.WizardForm.pas' {WizardForm},
|
|
IDE.Wizard.WizardFileForm in 'Src\IDE.Wizard.WizardFileForm.pas' {WizardFileForm},
|
|
IDE.FileAssocFunc in 'Src\IDE.FileAssocFunc.pas',
|
|
NewUxTheme.TmSchema in '..\Components\NewUxTheme.TmSchema.pas',
|
|
NewUxTheme in '..\Components\NewUxTheme.pas',
|
|
Shared.DebugStruct in 'Src\Shared.DebugStruct.pas',
|
|
BrowseFunc in '..\Components\BrowseFunc.pas',
|
|
IDE.SignToolsForm in 'Src\IDE.SignToolsForm.pas' {SignToolsForm},
|
|
IDE.InputQueryComboForm in 'Src\IDE.InputQueryComboForm.pas',
|
|
IDE.InputQueryMemoForm in 'Src\IDE.InputQueryMemoForm.pas',
|
|
ScintInt in '..\Components\ScintInt.pas',
|
|
ScintEdit in '..\Components\ScintEdit.pas',
|
|
IDE.ScintStylerInnoSetup in 'Src\IDE.ScintStylerInnoSetup.pas',
|
|
ModernColors in '..\Components\ModernColors.pas',
|
|
IDE.MsgBoxDesignerForm in 'Src\IDE.MsgBoxDesignerForm.pas' {MsgBoxDesignerForm},
|
|
IDE.IDEScintEdit in 'Src\IDE.IDEScintEdit.pas',
|
|
IDE.FilesDesignerForm in 'Src\IDE.FilesDesignerForm.pas' {FilesDesignerForm},
|
|
IDE.Wizard.WizardFormFilesHelper in 'Src\IDE.Wizard.WizardFormFilesHelper.pas',
|
|
NewTabSet in '..\Components\NewTabSet.pas',
|
|
NewStaticText in '..\Components\NewStaticText.pas',
|
|
BidiUtils in '..\Components\BidiUtils.pas',
|
|
DropListBox in '..\Components\DropListBox.pas',
|
|
NewCheckListBox in '..\Components\NewCheckListBox.pas',
|
|
NewNotebook in '..\Components\NewNotebook.pas',
|
|
TaskbarProgressFunc in '..\Components\TaskbarProgressFunc.pas',
|
|
IDE.HtmlHelpFunc in 'Src\IDE.HtmlHelpFunc.pas',
|
|
UIStateForm in '..\Components\UIStateForm.pas',
|
|
Shared.LangOptionsSectionDirectives in 'Src\Shared.LangOptionsSectionDirectives.pas',
|
|
Shared.SetupMessageIDs in 'Src\Shared.SetupMessageIDs.pas',
|
|
Shared.SetupSectionDirectives in 'Src\Shared.SetupSectionDirectives.pas',
|
|
Shared.ConfigIniFile in 'Src\Shared.ConfigIniFile.pas',
|
|
Shared.SignToolsFunc in 'Src\Shared.SignToolsFunc.pas',
|
|
Shared.FileClass in 'Src\Shared.FileClass.pas',
|
|
Shared.Int64Em in 'Src\Shared.Int64Em.pas',
|
|
Shared.TaskDialogFunc in 'Src\Shared.TaskDialogFunc.pas',
|
|
IDE.RegistryDesignerForm in 'Src\IDE.RegistryDesignerForm.pas' {RegistryDesignerForm},
|
|
IDE.Wizard.WizardFormRegistryHelper in 'Src\IDE.Wizard.WizardFormRegistryHelper.pas',
|
|
ScintInt.InnoSetup in '..\Components\ScintInt.InnoSetup.pas',
|
|
Shared.ScriptFunc in 'Src\Shared.ScriptFunc.pas',
|
|
Shared.SetupSteps in 'Src\Shared.SetupSteps.pas',
|
|
Shared.Struct in 'Src\Shared.Struct.pas',
|
|
SHA256 in '..\Components\SHA256.pas',
|
|
Shared.DotNetVersion in 'Src\Shared.DotNetVersion.pas',
|
|
isxclasses_wordlists_generated in '..\ISHelp\isxclasses_wordlists_generated.pas',
|
|
IDE.ImagesModule in 'Src\IDE.ImagesModule.pas' {ImagesModule: TDataModule},
|
|
ECDSA in '..\Components\ECDSA.pas',
|
|
ISSigFunc in '..\Components\ISSigFunc.pas',
|
|
StringScanner in '..\Components\StringScanner.pas';
|
|
|
|
{$SETPEOSVERSION 6.1}
|
|
{$SETPESUBSYSVERSION 6.1}
|
|
{$WEAKLINKRTTI ON}
|
|
|
|
{$R Res\Compil32.docicon.res}
|
|
{$R Res\Compil32.manifest.res}
|
|
{$R Res\Compil32.versionandicon.res}
|
|
|
|
procedure SetAppUserModelID;
|
|
var
|
|
Func: function(AppID: PWideChar): HRESULT; stdcall;
|
|
begin
|
|
{ For the IDE to be pinnable and show a Jump List, it is necessary to
|
|
explicitly assign an AppUserModelID because by default the taskbar excludes
|
|
applications that have "Setup" in their name. }
|
|
Func := GetProcAddress(GetModuleHandle('shell32.dll'),
|
|
'SetCurrentProcessExplicitAppUserModelID');
|
|
if Assigned(Func) then
|
|
Func('JR.InnoSetup.IDE.6');
|
|
end;
|
|
|
|
procedure RegisterApplicationRestart;
|
|
const
|
|
RESTART_MAX_CMD_LINE = 1024;
|
|
RESTART_NO_CRASH = $1;
|
|
RESTART_NO_HANG = $2;
|
|
RESTART_NO_PATCH = $4;
|
|
RESTART_NO_REBOOT = $8;
|
|
var
|
|
Func: function(pwzCommandLine: PWideChar; dwFlags: DWORD): HRESULT; stdcall;
|
|
CommandLine: WideString;
|
|
begin
|
|
{ Allow Restart Manager to restart us after updates. }
|
|
|
|
Func := GetProcAddress(GetModuleHandle('kernel32.dll'),
|
|
'RegisterApplicationRestart');
|
|
if Assigned(Func) then begin
|
|
{ Rebuild the command line, can't just use an exact copy since it might contain
|
|
relative path names but Restart Manager doesn't restore the working
|
|
directory. }
|
|
if CommandLineWizard then
|
|
CommandLine := '/WIZARD'
|
|
else begin
|
|
CommandLine := CommandLineFilename;
|
|
if CommandLine <> '' then
|
|
CommandLine := '"' + CommandLine + '"';
|
|
if CommandLineCompile then
|
|
CommandLine := '/CC ' + CommandLine;
|
|
end;
|
|
|
|
if Length(CommandLine) > RESTART_MAX_CMD_LINE then
|
|
CommandLine := '';
|
|
|
|
Func(PWideChar(CommandLine), RESTART_NO_CRASH or RESTART_NO_HANG or RESTART_NO_REBOOT);
|
|
end;
|
|
end;
|
|
|
|
procedure CreateMutexes;
|
|
{ Creates the two mutexes used by Inno Setup's own installer/uninstaller to
|
|
see if the compiler is still running.
|
|
One of the mutexes is created in the global name space (which makes it
|
|
possible to access the mutex across user sessions in Windows XP); the other
|
|
is created in the session name space (because versions of Windows NT prior
|
|
to 4.0 TSE don't have a global name space and don't support the 'Global\'
|
|
prefix). }
|
|
const
|
|
MutexName = 'InnoSetupCompilerAppMutex';
|
|
begin
|
|
CreateMutex(MutexName);
|
|
CreateMutex('Global\' + MutexName); { don't localize }
|
|
end;
|
|
|
|
var
|
|
InitialCurDir: String;
|
|
|
|
procedure CheckParams;
|
|
|
|
procedure Error;
|
|
begin
|
|
MessageBox(0, SCompilerCommandLineHelp3, SCompilerFormCaption,
|
|
MB_OK or MB_ICONEXCLAMATION);
|
|
Halt(1);
|
|
end;
|
|
|
|
var
|
|
P, I: Integer;
|
|
S: String;
|
|
Dummy: Boolean;
|
|
begin
|
|
P := NewParamCount;
|
|
I := 1;
|
|
while I <= P do begin
|
|
S := NewParamStr(I);
|
|
if CompareText(S, '/CC') = 0 then
|
|
CommandLineCompile := True
|
|
else if CompareText(S, '/WIZARD') = 0 then begin
|
|
if I = P then
|
|
Error;
|
|
CommandLineWizard := True;
|
|
CommandLineWizardName := NewParamStr(I+1);
|
|
Inc(I);
|
|
end
|
|
else if CompareText(S, '/ASSOC') = 0 then begin
|
|
try
|
|
RegisterISSFileAssociation(False, Dummy);
|
|
except
|
|
MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
|
|
Halt(2);
|
|
end;
|
|
Halt;
|
|
end
|
|
else if CompareText(S, '/UNASSOC') = 0 then begin
|
|
try
|
|
UnregisterISSFileAssociation(True);
|
|
except
|
|
MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
|
|
Halt(2);
|
|
end;
|
|
Halt;
|
|
end
|
|
else if (S = '') or (S[1] = '/') or (CommandLineFilename <> '') then
|
|
Error
|
|
else
|
|
CommandLineFilename := PathExpand(PathCombine(InitialCurDir, S));
|
|
Inc(I);
|
|
end;
|
|
if (CommandLineCompile or CommandLineWizard) and (CommandLineFilename = '') then
|
|
Error;
|
|
end;
|
|
|
|
begin
|
|
{$IFNDEF STATICCOMPILER}
|
|
try
|
|
InitISCmplrLibrary;
|
|
except
|
|
begin
|
|
MessageBox(0, PChar(Format('Could not load %s: %s' {$IFDEF DEBUG} + #13#10#13#10'Did you build the ISCmplr project?' {$ENDIF},
|
|
[ISCmplrDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
|
|
Halt(3);
|
|
end;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
try
|
|
InitIsscintLibrary;
|
|
except
|
|
begin
|
|
MessageBox(0, PChar(Format('Could not load %s: %s' {$IFDEF DEBUG} + #13#10#13#10'Did you run Projects\Bin\synch-isfiles.bat as instructed in README.md?' {$ENDIF},
|
|
[IsscintDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
|
|
Halt(4);
|
|
end;
|
|
end;
|
|
|
|
{$IFDEF DEBUG}
|
|
ReportMemoryLeaksOnShutdown := True;
|
|
{$ENDIF}
|
|
|
|
InitialCurDir := GetCurrentDir;
|
|
if not SetCurrentDir(PathExtractDir(NewParamStr(0))) then
|
|
SetCurrentDir(GetSystemDir);
|
|
|
|
SetAppUserModelID;
|
|
CreateMutexes;
|
|
Application.Initialize;
|
|
CheckParams;
|
|
RegisterApplicationRestart;
|
|
|
|
if not CommandLineWizard then
|
|
Application.MainFormOnTaskBar := True;
|
|
|
|
{ The 'with' is so that the Delphi IDE doesn't mess with these }
|
|
with Application do begin
|
|
if CommandLineWizard then
|
|
Title := CommandLineWizardName
|
|
else
|
|
Title := SCompilerFormCaption;
|
|
end;
|
|
|
|
Application.CreateForm(TImagesModule, ImagesModule);
|
|
Application.CreateForm(TMainForm, MainForm);
|
|
Application.Run;
|
|
end.
|