ISCmplr.dpr 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. library ISCmplr;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2020 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Compiler DLL
  8. }
  9. {$IMAGEBASE $00800000}
  10. {$SETPEOSVERSION 6.0}
  11. {$SETPESUBSYSVERSION 6.0}
  12. {$WEAKLINKRTTI ON}
  13. uses
  14. SafeDLLPath in 'SafeDLLPath.pas',
  15. SysUtils,
  16. CompInt in 'CompInt.pas',
  17. CompPreprocInt in 'CompPreprocInt.pas',
  18. Compile in 'Compile.pas',
  19. CompMsgs in 'CompMsgs.pas',
  20. Struct in 'Struct.pas',
  21. ScriptFunc in 'ScriptFunc.pas',
  22. ScriptFunc_C in 'ScriptFunc_C.pas',
  23. ScriptCompiler in 'ScriptCompiler.pas',
  24. ScriptClasses_C in 'ScriptClasses_C.pas',
  25. ResUpdate in 'ResUpdate.pas',
  26. CompExeUpdate in 'CompExeUpdate.pas',
  27. Compress in 'Compress.pas',
  28. CompressZlib in 'CompressZlib.pas',
  29. bzlib in 'bzlib.pas',
  30. LZMA in 'LZMA.pas',
  31. FileClass in 'FileClass.pas',
  32. ArcFour in 'ArcFour.pas',
  33. VerInfo in 'VerInfo.pas';
  34. {$R ISCmplr.images.res}
  35. {$R ISCmplr.version.res}
  36. function ISDllCompileScript(const Params: TCompileScriptParamsEx): Integer;
  37. stdcall;
  38. begin
  39. Result := ISCompileScript(Params, False);
  40. end;
  41. type
  42. PWrapperData = ^TWrapperData;
  43. TWrapperData = record
  44. CallerParams: PCompileScriptParamsEx;
  45. LastLineRead: String;
  46. end;
  47. { Does not support iscbNotifyPreproc }
  48. function WrapperCallbackProc(Code: Integer; var Data: TCompilerCallbackData;
  49. AppData: Longint): Integer;
  50. stdcall;
  51. var
  52. WrapperData: PWrapperData;
  53. CallerParams: PCompileScriptParamsEx;
  54. AnsiStatusMsg, AnsiOutputExeFilename, AnsiErrorMsg, AnsiErrorFilename: AnsiString;
  55. begin
  56. WrapperData := PWrapperData(AppData);
  57. CallerParams := WrapperData.CallerParams;
  58. case Code of
  59. iscbReadScript:
  60. begin
  61. Result := CallerParams.CallbackProc(Code, Data, CallerParams.AppData);
  62. if Assigned(Data.LineRead) then begin
  63. WrapperData.LastLineRead := String(PAnsiChar(Data.LineRead));
  64. Data.LineRead := PWideChar(WrapperData.LastLineRead);
  65. end;
  66. end;
  67. iscbNotifyStatus:
  68. begin
  69. if Assigned(Data.StatusMsg) then begin
  70. AnsiStatusMsg := AnsiString(Data.StatusMsg);
  71. Data.StatusMsg := PWideChar(PAnsiChar(AnsiStatusMsg));
  72. end;
  73. Result := CallerParams.CallbackProc(Code, Data, CallerParams.AppData);
  74. end;
  75. iscbNotifySuccess:
  76. begin
  77. if Assigned(Data.OutputExeFilename) then begin
  78. AnsiOutputExeFilename := AnsiString(Data.OutputExeFilename);
  79. Data.OutputExeFilename := PWideChar(PAnsiChar(AnsiOutputExeFilename));
  80. end;
  81. Result := CallerParams.CallbackProc(Code, Data, CallerParams.AppData);
  82. end;
  83. iscbNotifyError:
  84. begin
  85. if Assigned(Data.ErrorMsg) then begin
  86. AnsiErrorMsg := AnsiString(Data.ErrorMsg);
  87. Data.ErrorMsg := PWideChar(PAnsiChar(AnsiErrorMsg));
  88. end;
  89. if Assigned(Data.ErrorFilename) then begin
  90. AnsiErrorFilename := AnsiString(Data.ErrorFilename);
  91. Data.ErrorFilename := PWideChar(PAnsiChar(AnsiErrorFilename));
  92. end;
  93. Result := CallerParams.CallbackProc(Code, Data, CallerParams.AppData);
  94. end;
  95. else
  96. Result := CallerParams.CallbackProc(Code, Data, CallerParams.AppData);
  97. end;
  98. end;
  99. function ISDllCompileScriptA(const Params: TCompileScriptParamsEx): Integer;
  100. stdcall;
  101. var
  102. WrapperData: TWrapperData;
  103. WrapperParams: PCompileScriptParamsEx;
  104. P: PAnsiChar;
  105. Options: String;
  106. begin
  107. if ((Params.Size <> SizeOf(Params)) and
  108. (Params.Size <> SizeOf(TCompileScriptParams))) or
  109. not Assigned(Params.CallbackProc) then begin
  110. Result := isceInvalidParam;
  111. Exit;
  112. end;
  113. WrapperData.CallerParams := @Params;
  114. GetMem(WrapperParams, Params.Size);
  115. try
  116. Move(Params, WrapperParams^, Params.Size);
  117. WrapperParams.CallbackProc := WrapperCallbackProc;
  118. WrapperParams.AppData := Integer(@WrapperData);
  119. if Assigned(Params.CompilerPath) then
  120. WrapperParams.CompilerPath := PWideChar(String(PAnsiChar(Params.CompilerPath)));
  121. if Assigned(Params.SourcePath) then
  122. WrapperParams.SourcePath := PWideChar(String(PAnsiChar(Params.SourcePath)));
  123. if (Params.Size <> SizeOf(TCompileScriptParams)) and Assigned(Params.Options) then begin
  124. P := PAnsiChar(Params.Options);
  125. while P^ <> #0 do begin
  126. Options := Options + String(P) + #0;
  127. Inc(P, StrLen(P) + 1);
  128. end;
  129. WrapperParams.Options := PWideChar(Options);
  130. end;
  131. Result := ISCompileScript(WrapperParams^, False);
  132. finally
  133. FreeMem(WrapperParams);
  134. end;
  135. end;
  136. function ISDllGetVersion: PCompilerVersionInfo; stdcall;
  137. begin
  138. Result := ISGetVersion;
  139. end;
  140. exports
  141. ISDllCompileScript name 'ISDllCompileScriptW',
  142. ISDllCompileScriptA name 'ISDllCompileScript',
  143. ISDllGetVersion;
  144. begin
  145. { The user might call ISDllCompileScript from multiple threads
  146. simultaneously, so set our instance of the Delphi memory manager to
  147. thread-safe mode }
  148. IsMultiThread := True;
  149. end.