如何在 SysInit._InitExe 调用之前放置代码?

How can I place code before SysInit._InitExe call?

我已经把 asm INT 3 end; 放在了我的主程序的第一行。

program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  asm INT 3 end;

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

然而,SysInit._InitExe 调用放在它之前。 请参考下图。 从 uses 子句中删除 VCL 单元不是一个选项。

使用 built-in 工具无法满足您的需求。您需要对可执行文件进行一些 post 编译修改。

  1. 在源文件中包含您需要首先执行的代码,以便将其编译成可执行文件,但不要调用它。
  2. 修改 PE 中的入口点 header 以指向您的新入口点代码。
  3. 安排您的新入口点代码在完成后跳转到原始入口点。

您可以将 asm 代码放入新单元的初始化部分,并将该单元首先放入项目的 uses 子句中。这样代码应该在系统单元的初始化部分之后执行。 (这个一定要测试,我完全没试过。)