Compil32.dpr 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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.GotoFileForm in 'Src\IDE.GotoFileForm.pas' {GotoFileForm},
  34. IDE.LicenseKeyForm in 'Src\IDE.LicenseKeyForm.pas' {LicenseKeyForm},
  35. IDE.InputQueryComboForm in 'Src\IDE.InputQueryComboForm.pas' {InputQueryComboForm},
  36. IDE.InputQueryMemoForm in 'Src\IDE.InputQueryMemoForm.pas' {InputQueryMemoForm},
  37. ScintInt in '..\Components\ScintInt.pas',
  38. ScintEdit in '..\Components\ScintEdit.pas',
  39. IDE.ScintStylerInnoSetup in 'Src\IDE.ScintStylerInnoSetup.pas',
  40. ModernColors in '..\Components\ModernColors.pas',
  41. IDE.MsgBoxDesignerForm in 'Src\IDE.MsgBoxDesignerForm.pas' {MsgBoxDesignerForm},
  42. IDE.IDEScintEdit in 'Src\IDE.IDEScintEdit.pas',
  43. IDE.FilesDesignerForm in 'Src\IDE.FilesDesignerForm.pas' {FilesDesignerForm},
  44. IDE.Wizard.WizardFormFilesHelper in 'Src\IDE.Wizard.WizardFormFilesHelper.pas',
  45. NewTabSet in '..\Components\NewTabSet.pas',
  46. NewStaticText in '..\Components\NewStaticText.pas',
  47. BidiUtils in '..\Components\BidiUtils.pas',
  48. DropListBox in '..\Components\DropListBox.pas',
  49. BitmapButton in '..\Components\BitmapButton.pas',
  50. BitmapImage in '..\Components\BitmapImage.pas',
  51. NewCheckListBox in '..\Components\NewCheckListBox.pas',
  52. NewNotebook in '..\Components\NewNotebook.pas',
  53. TaskbarProgressFunc in '..\Components\TaskbarProgressFunc.pas',
  54. IDE.HtmlHelpFunc in 'Src\IDE.HtmlHelpFunc.pas',
  55. UIStateForm in '..\Components\UIStateForm.pas',
  56. Shared.LangOptionsSectionDirectives in 'Src\Shared.LangOptionsSectionDirectives.pas',
  57. Shared.SetupMessageIDs in 'Src\Shared.SetupMessageIDs.pas',
  58. Shared.SetupSectionDirectives in 'Src\Shared.SetupSectionDirectives.pas',
  59. Shared.ConfigIniFile in 'Src\Shared.ConfigIniFile.pas',
  60. Shared.SignToolsFunc in 'Src\Shared.SignToolsFunc.pas',
  61. Shared.LicenseFunc in 'Src\Shared.LicenseFunc.pas',
  62. Shared.FileClass in 'Src\Shared.FileClass.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. UnsignedFunc in '..\Components\UnsignedFunc.pas',
  79. VCL.Styles,
  80. VCL.Themes,
  81. IDE.MainForm.MRUHelper in 'Src\IDE.MainForm.MRUHelper.pas',
  82. IDE.MainForm.UAHHelper in 'Src\IDE.MainForm.UAHHelper.pas',
  83. IDE.MainForm.NavigationHelper in 'Src\IDE.MainForm.NavigationHelper.pas',
  84. IDE.MainForm.FindReplaceHelper in 'Src\IDE.MainForm.FindReplaceHelper.pas',
  85. IDE.MainForm.UpdateMenuHelper in 'Src\IDE.MainForm.UpdateMenuHelper.pas',
  86. IDE.MainForm.ToolsHelper in 'Src\IDE.MainForm.ToolsHelper.pas',
  87. IDE.MainForm.AutoCompleteAndCallTipsHelper in 'Src\IDE.MainForm.AutoCompleteAndCallTipsHelper.pas',
  88. IDE.MainForm.ScintHelper in 'Src\IDE.MainForm.ScintHelper.pas',
  89. IDE.MainForm.FinalHelper in 'Src\IDE.MainForm.FinalHelper.pas';
  90. {$SETPEOSVERSION 6.1}
  91. {$SETPESUBSYSVERSION 6.1}
  92. {$WEAKLINKRTTI ON}
  93. {$R *.res}
  94. {$R Res\Compil32.docicon.res}
  95. {$R Res\Compil32.manifest.res}
  96. {$R Res\Compil32.versionandicon.res}
  97. procedure SetAppUserModelID;
  98. var
  99. Func: function(AppID: PWideChar): HRESULT; stdcall;
  100. begin
  101. { For the IDE to be pinnable and show a Jump List, it is necessary to
  102. explicitly assign an AppUserModelID because by default the taskbar excludes
  103. applications that have "Setup" in their name. }
  104. Func := GetProcAddress(GetModuleHandle('shell32.dll'),
  105. 'SetCurrentProcessExplicitAppUserModelID');
  106. if Assigned(Func) then
  107. Func('JR.InnoSetup.IDE.6');
  108. end;
  109. procedure RegisterApplicationRestart;
  110. const
  111. RESTART_MAX_CMD_LINE = 1024;
  112. RESTART_NO_CRASH = $1;
  113. RESTART_NO_HANG = $2;
  114. RESTART_NO_PATCH = $4;
  115. RESTART_NO_REBOOT = $8;
  116. var
  117. Func: function(pwzCommandLine: PWideChar; dwFlags: DWORD): HRESULT; stdcall;
  118. CommandLine: WideString;
  119. begin
  120. { Allow Restart Manager to restart us after updates. }
  121. Func := GetProcAddress(GetModuleHandle('kernel32.dll'),
  122. 'RegisterApplicationRestart');
  123. if Assigned(Func) then begin
  124. { Rebuild the command line, can't just use an exact copy since it might contain
  125. relative path names but Restart Manager doesn't restore the working
  126. directory. }
  127. if CommandLineWizard then
  128. CommandLine := '/WIZARD'
  129. else begin
  130. CommandLine := CommandLineFilename;
  131. if CommandLine <> '' then
  132. CommandLine := '"' + CommandLine + '"';
  133. if CommandLineCompile then
  134. CommandLine := '/CC ' + CommandLine;
  135. end;
  136. if Length(CommandLine) > RESTART_MAX_CMD_LINE then
  137. CommandLine := '';
  138. Func(PWideChar(CommandLine), RESTART_NO_CRASH or RESTART_NO_HANG or RESTART_NO_REBOOT);
  139. end;
  140. end;
  141. procedure CreateMutexes;
  142. { Creates the two mutexes used by Inno Setup's own installer/uninstaller to
  143. see if the compiler is still running.
  144. One of the mutexes is created in the global name space (which makes it
  145. possible to access the mutex across user sessions in Windows XP); the other
  146. is created in the session name space (because versions of Windows NT prior
  147. to 4.0 TSE don't have a global name space and don't support the 'Global\'
  148. prefix). }
  149. const
  150. MutexName = 'InnoSetupCompilerAppMutex';
  151. begin
  152. CreateMutex(MutexName);
  153. CreateMutex('Global\' + MutexName); { don't localize }
  154. end;
  155. var
  156. InitialCurDir: String;
  157. procedure CheckParams;
  158. procedure Error;
  159. begin
  160. MessageBox(0, SCompilerCommandLineHelp3, SCompilerFormCaption,
  161. MB_OK or MB_ICONEXCLAMATION);
  162. Halt(1);
  163. end;
  164. var
  165. P, I: Integer;
  166. S: String;
  167. Dummy: Boolean;
  168. begin
  169. P := NewParamCount;
  170. I := 1;
  171. while I <= P do begin
  172. S := NewParamStr(I);
  173. if CompareText(S, '/CC') = 0 then
  174. CommandLineCompile := True
  175. else if CompareText(S, '/WIZARD') = 0 then begin
  176. if I = P then
  177. Error;
  178. CommandLineWizard := True;
  179. CommandLineWizardName := NewParamStr(I+1);
  180. Inc(I);
  181. end
  182. else if CompareText(S, '/ASSOC') = 0 then begin
  183. try
  184. RegisterISSFileAssociation(False, Dummy);
  185. except
  186. MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
  187. Halt(2);
  188. end;
  189. Halt;
  190. end
  191. else if CompareText(S, '/UNASSOC') = 0 then begin
  192. try
  193. UnregisterISSFileAssociation(True);
  194. except
  195. MessageBox(0, PChar(GetExceptMessage), nil, MB_OK or MB_ICONSTOP);
  196. Halt(2);
  197. end;
  198. Halt;
  199. end
  200. else if (S = '') or (S[1] = '/') or (CommandLineFilename <> '') then
  201. Error
  202. else
  203. CommandLineFilename := PathExpand(PathCombine(InitialCurDir, S));
  204. Inc(I);
  205. end;
  206. if (CommandLineCompile or CommandLineWizard) and (CommandLineFilename = '') then
  207. Error;
  208. end;
  209. begin
  210. {$IFNDEF STATICCOMPILER}
  211. try
  212. InitISCmplrLibrary;
  213. except
  214. begin
  215. MessageBox(0, PChar(Format('Could not load %s: %s' {$IFDEF DEBUG} + #13#10#13#10'Did you build the ISCmplr project?' {$ENDIF},
  216. [ISCmplrDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
  217. Halt(3);
  218. end;
  219. end;
  220. {$ENDIF}
  221. try
  222. InitIsscintLibrary;
  223. except
  224. begin
  225. 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},
  226. [IsscintDLL, GetExceptMessage])), nil, MB_OK or MB_ICONSTOP);
  227. Halt(4);
  228. end;
  229. end;
  230. {$IFDEF DEBUG}
  231. ReportMemoryLeaksOnShutdown := True;
  232. {$ENDIF}
  233. InitialCurDir := GetCurrentDir;
  234. if not SetCurrentDir(PathExtractDir(NewParamStr(0))) then
  235. SetCurrentDir(GetSystemDir);
  236. SetAppUserModelID;
  237. CreateMutexes;
  238. Application.Initialize;
  239. CheckParams;
  240. RegisterApplicationRestart;
  241. if not CommandLineWizard then
  242. Application.MainFormOnTaskBar := True;
  243. { The 'with' is so that the Delphi IDE doesn't mess with these }
  244. with Application do begin
  245. if CommandLineWizard then
  246. Title := CommandLineWizardName
  247. else
  248. Title := SCompilerFormCaption;
  249. end;
  250. { Don't allow VCL Styles to style menus using owner drawing. Instead we get native dark menus
  251. using SetPreferredAppMode and FlushMenuThemes in IDE.MainForm. If you get light menus anyway on
  252. modern Windows then you should update the version check at the bottom of NewUxTheme. Using
  253. VCL Styles anyway, for example on older versions of Windows, is not the correct approach:
  254. TSysPopupStyleHook does not support our use of bitmaps set using MIIM_BITMAP on a TMenuItem, nor
  255. does it support our fake shortcuts set with SetFakeShortCut. }
  256. TStyleManager.SystemHooks := TStyleManager.SystemHooks - [shMenus]; { This keeps shDialogs and shTooltips }
  257. Application.CreateForm(TImagesModule, ImagesModule);
  258. Application.CreateForm(TMainForm, MainForm);
  259. Application.Run;
  260. end.