Compil32.dpr 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. program Compil32;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2025 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Compiler
  8. }
  9. uses
  10. SafeDLLPath in '..\Components\SafeDLLPath.pas',
  11. Windows,
  12. SysUtils,
  13. Forms,
  14. PathFunc in '..\Components\PathFunc.pas',
  15. TrustFunc in '..\Components\TrustFunc.pas',
  16. IDE.MainForm in 'Src\IDE.MainForm.pas' {MainForm},
  17. Shared.CommonFunc.Vcl in 'Src\Shared.CommonFunc.Vcl.pas',
  18. Shared.CommonFunc in 'Src\Shared.CommonFunc.pas',
  19. IDE.HelperFunc in 'Src\IDE.HelperFunc.pas',
  20. IDE.Messages in 'Src\IDE.Messages.pas',
  21. Shared.CompilerInt in 'Src\Shared.CompilerInt.pas',
  22. Shared.CompilerInt.Struct in 'Src\Shared.CompilerInt.Struct.pas',
  23. IDE.OptionsForm in 'Src\IDE.OptionsForm.pas' {OptionsForm},
  24. IDE.StartupForm in 'Src\IDE.StartupForm.pas' {StartupForm},
  25. IDE.Wizard.WizardForm in 'Src\IDE.Wizard.WizardForm.pas' {WizardForm},
  26. IDE.Wizard.WizardFileForm in 'Src\IDE.Wizard.WizardFileForm.pas' {WizardFileForm},
  27. IDE.FileAssocFunc in 'Src\IDE.FileAssocFunc.pas',
  28. NewUxTheme.TmSchema in '..\Components\NewUxTheme.TmSchema.pas',
  29. NewUxTheme in '..\Components\NewUxTheme.pas',
  30. Shared.DebugStruct in 'Src\Shared.DebugStruct.pas',
  31. BrowseFunc in '..\Components\BrowseFunc.pas',
  32. IDE.SignToolsForm in 'Src\IDE.SignToolsForm.pas' {SignToolsForm},
  33. IDE.LicenseKeyForm in 'Src\IDE.LicenseKeyForm.pas' {LicenseKeyForm},
  34. IDE.InputQueryComboForm in 'Src\IDE.InputQueryComboForm.pas',
  35. IDE.InputQueryMemoForm in 'Src\IDE.InputQueryMemoForm.pas',
  36. ScintInt in '..\Components\ScintInt.pas',
  37. ScintEdit in '..\Components\ScintEdit.pas',
  38. IDE.ScintStylerInnoSetup in 'Src\IDE.ScintStylerInnoSetup.pas',
  39. ModernColors in '..\Components\ModernColors.pas',
  40. IDE.MsgBoxDesignerForm in 'Src\IDE.MsgBoxDesignerForm.pas' {MsgBoxDesignerForm},
  41. IDE.IDEScintEdit in 'Src\IDE.IDEScintEdit.pas',
  42. IDE.FilesDesignerForm in 'Src\IDE.FilesDesignerForm.pas' {FilesDesignerForm},
  43. IDE.Wizard.WizardFormFilesHelper in 'Src\IDE.Wizard.WizardFormFilesHelper.pas',
  44. NewTabSet in '..\Components\NewTabSet.pas',
  45. NewStaticText in '..\Components\NewStaticText.pas',
  46. BidiUtils in '..\Components\BidiUtils.pas',
  47. DropListBox in '..\Components\DropListBox.pas',
  48. BitmapButton in '..\Components\BitmapButton.pas',
  49. BitmapImage in '..\Components\BitmapImage.pas',
  50. NewCheckListBox in '..\Components\NewCheckListBox.pas',
  51. NewNotebook in '..\Components\NewNotebook.pas',
  52. TaskbarProgressFunc in '..\Components\TaskbarProgressFunc.pas',
  53. IDE.HtmlHelpFunc in 'Src\IDE.HtmlHelpFunc.pas',
  54. UIStateForm in '..\Components\UIStateForm.pas',
  55. Shared.LangOptionsSectionDirectives in 'Src\Shared.LangOptionsSectionDirectives.pas',
  56. Shared.SetupMessageIDs in 'Src\Shared.SetupMessageIDs.pas',
  57. Shared.SetupSectionDirectives in 'Src\Shared.SetupSectionDirectives.pas',
  58. Shared.ConfigIniFile in 'Src\Shared.ConfigIniFile.pas',
  59. Shared.SignToolsFunc in 'Src\Shared.SignToolsFunc.pas',
  60. Shared.LicenseFunc in 'Src\Shared.LicenseFunc.pas',
  61. Shared.FileClass in 'Src\Shared.FileClass.pas',
  62. Shared.Int64Em in 'Src\Shared.Int64Em.pas',
  63. Shared.TaskDialogFunc in 'Src\Shared.TaskDialogFunc.pas',
  64. IDE.RegistryDesignerForm in 'Src\IDE.RegistryDesignerForm.pas' {RegistryDesignerForm},
  65. IDE.Wizard.WizardFormRegistryHelper in 'Src\IDE.Wizard.WizardFormRegistryHelper.pas',
  66. ScintInt.InnoSetup in '..\Components\ScintInt.InnoSetup.pas',
  67. Shared.ScriptFunc in 'Src\Shared.ScriptFunc.pas',
  68. Shared.SetupSteps in 'Src\Shared.SetupSteps.pas',
  69. Shared.Struct in 'Src\Shared.Struct.pas',
  70. SHA256 in '..\Components\SHA256.pas',
  71. Shared.DotNetVersion in 'Src\Shared.DotNetVersion.pas',
  72. isxclasses_wordlists_generated in '..\ISHelp\isxclasses_wordlists_generated.pas',
  73. IDE.ImagesModule in 'Src\IDE.ImagesModule.pas' {ImagesModule: TDataModule},
  74. ECDSA in '..\Components\ECDSA.pas',
  75. ISSigFunc in '..\Components\ISSigFunc.pas',
  76. StringScanner in '..\Components\StringScanner.pas',
  77. Resample in '..\Components\Resample.pas',
  78. VCL.Styles,
  79. VCL.Themes;
  80. {$SETPEOSVERSION 6.1}
  81. {$SETPESUBSYSVERSION 6.1}
  82. {$WEAKLINKRTTI ON}
  83. {$R Res\Compil32.docicon.res}
  84. {$R Res\Compil32.manifest.res}
  85. {$R Res\Compil32.versionandicon.res}
  86. {$R Res\Compil32.darkstyle.res}
  87. procedure SetAppUserModelID;
  88. var
  89. Func: function(AppID: PWideChar): HRESULT; stdcall;
  90. begin
  91. { For the IDE to be pinnable and show a Jump List, it is necessary to
  92. explicitly assign an AppUserModelID because by default the taskbar excludes
  93. applications that have "Setup" in their name. }
  94. Func := GetProcAddress(GetModuleHandle('shell32.dll'),
  95. 'SetCurrentProcessExplicitAppUserModelID');
  96. if Assigned(Func) then
  97. Func('JR.InnoSetup.IDE.6');
  98. end;
  99. procedure RegisterApplicationRestart;
  100. const
  101. RESTART_MAX_CMD_LINE = 1024;
  102. RESTART_NO_CRASH = $1;
  103. RESTART_NO_HANG = $2;
  104. RESTART_NO_PATCH = $4;
  105. RESTART_NO_REBOOT = $8;
  106. var
  107. Func: function(pwzCommandLine: PWideChar; dwFlags: DWORD): HRESULT; stdcall;
  108. CommandLine: WideString;
  109. begin
  110. { Allow Restart Manager to restart us after updates. }
  111. Func := GetProcAddress(GetModuleHandle('kernel32.dll'),
  112. 'RegisterApplicationRestart');
  113. if Assigned(Func) then begin
  114. { Rebuild the command line, can't just use an exact copy since it might contain
  115. relative path names but Restart Manager doesn't restore the working
  116. directory. }
  117. if CommandLineWizard then
  118. CommandLine := '/WIZARD'
  119. else begin
  120. CommandLine := CommandLineFilename;
  121. if CommandLine <> '' then
  122. CommandLine := '"' + CommandLine + '"';
  123. if CommandLineCompile then
  124. CommandLine := '/CC ' + CommandLine;
  125. end;
  126. if Length(CommandLine) > RESTART_MAX_CMD_LINE then
  127. CommandLine := '';
  128. Func(PWideChar(CommandLine), RESTART_NO_CRASH or RESTART_NO_HANG or RESTART_NO_REBOOT);
  129. end;
  130. end;
  131. procedure CreateMutexes;
  132. { Creates the two mutexes used by Inno Setup's own installer/uninstaller to
  133. see if the compiler is still running.
  134. One of the mutexes is created in the global name space (which makes it
  135. possible to access the mutex across user sessions in Windows XP); the other
  136. is created in the session name space (because versions of Windows NT prior
  137. to 4.0 TSE don't have a global name space and don't support the 'Global\'
  138. prefix). }
  139. const
  140. MutexName = 'InnoSetupCompilerAppMutex';
  141. begin
  142. CreateMutex(MutexName);
  143. CreateMutex('Global\' + MutexName); { don't localize }
  144. end;
  145. var
  146. InitialCurDir: String;
  147. procedure CheckParams;
  148. procedure Error;
  149. begin
  150. MessageBox(0, SCompilerCommandLineHelp3, SCompilerFormCaption,
  151. MB_OK or MB_ICONEXCLAMATION);
  152. Halt(1);
  153. end;
  154. var
  155. P, I: Integer;
  156. S: String;
  157. Dummy: Boolean;
  158. begin
  159. P := NewParamCount;
  160. I := 1;
  161. while I <= P do begin
  162. S := NewParamStr(I);
  163. if CompareText(S, '/CC') = 0 then
  164. CommandLineCompile := True
  165. else if CompareText(S, '/WIZARD') = 0 then begin
  166. if I = P then
  167. Error;
  168. CommandLineWizard := True;
  169. CommandLineWizardName := NewParamStr(I+1);
  170. Inc(I);
  171. end
  172. else if CompareText(S, '/ASSOC') = 0 then begin
  173. try
  174. RegisterISSFileAssociation(False, Dummy);
  175. except
  176. MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
  177. Halt(2);
  178. end;
  179. Halt;
  180. end
  181. else if CompareText(S, '/UNASSOC') = 0 then begin
  182. try
  183. UnregisterISSFileAssociation(True);
  184. except
  185. MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
  186. Halt(2);
  187. end;
  188. Halt;
  189. end
  190. else if (S = '') or (S[1] = '/') or (CommandLineFilename <> '') then
  191. Error
  192. else
  193. CommandLineFilename := PathExpand(PathCombine(InitialCurDir, S));
  194. Inc(I);
  195. end;
  196. if (CommandLineCompile or CommandLineWizard) and (CommandLineFilename = '') then
  197. Error;
  198. end;
  199. begin
  200. {$IFNDEF STATICCOMPILER}
  201. try
  202. InitISCmplrLibrary;
  203. except
  204. begin
  205. MessageBox(0, PChar(Format('Could not load %s: %s' {$IFDEF DEBUG} + #13#10#13#10'Did you build the ISCmplr project?' {$ENDIF},
  206. [ISCmplrDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
  207. Halt(3);
  208. end;
  209. end;
  210. {$ENDIF}
  211. try
  212. InitIsscintLibrary;
  213. except
  214. begin
  215. 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},
  216. [IsscintDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
  217. Halt(4);
  218. end;
  219. end;
  220. {$IFDEF DEBUG}
  221. ReportMemoryLeaksOnShutdown := True;
  222. {$ENDIF}
  223. InitialCurDir := GetCurrentDir;
  224. if not SetCurrentDir(PathExtractDir(NewParamStr(0))) then
  225. SetCurrentDir(GetSystemDir);
  226. SetAppUserModelID;
  227. CreateMutexes;
  228. Application.Initialize;
  229. CheckParams;
  230. RegisterApplicationRestart;
  231. if not CommandLineWizard then
  232. Application.MainFormOnTaskBar := True;
  233. { The 'with' is so that the Delphi IDE doesn't mess with these }
  234. with Application do begin
  235. if CommandLineWizard then
  236. Title := CommandLineWizardName
  237. else
  238. Title := SCompilerFormCaption;
  239. end;
  240. if Assigned(FlushMenuThemes) then begin
  241. { We don't need VCL Styles for dark menus. This keeps shDialogs and shTooltips. }
  242. TStyleManager.SystemHooks := TStyleManager.SystemHooks - [shMenus];
  243. end;
  244. Application.CreateForm(TImagesModule, ImagesModule);
  245. Application.CreateForm(TMainForm, MainForm);
  246. Application.Run;
  247. end.