应用程序(TApplication)实例何时何地创建?

kob*_*bik 10 delphi debugging initialization delphi-5

Application创建实例的位置和时间?(同样适用于Screen实例).

我在部分FormsSystem initialization部分没有看到任何内容.
在之前的CPU窗口中Application.Initialize,我看到了对@_InitExe(SysInit)的调用- 它导致了_StartExe(系统)和大量的asm代码 - Application据我所知,这并没有创建实例.

我在这里错过了什么?

Dav*_*nan 13

从代码中解决这个问题很容易.你只需要进行文本搜索TApplication.Create.例如,使用IDE的"在文件中查找"功能.

但是你总是可以懒惰并让调试人员去做.

  1. 启用调试DCU.
  2. 设置断点TApplication.Create.
  3. 跑.

程序中断时,查看调用堆栈.您将看到该TApplication对象是从单元中实例化InitControlsControls.并且InitControls从单元的initialization部分调用Controls.

普通Villa VCL应用程序的完整调用堆栈如下所示:

Vcl.Forms.TApplication.Create(nil)
Vcl.Controls.InitControls
Vcl.Controls.Vcl.Controls
System.InitUnits
System._StartExe(???,???)
SysInit._InitExe($5A81BC)
Project1.Project1
:749933aa kernel32.BaseThreadInitThunk + 0x12
:76f09ef2 ntdll.RtlInitializeExceptionChain + 0x63
:76f09ec5 ntdll.RtlInitializeExceptionChain + 0x36

做同样的事情TScreen.Create,你会看到TScreen对象也被实例化了InitControls().

我不会试图解释所有这一切.我认为这里有足够的信息和建议供您从这里开始工作.虽然这是来自XE3应用程序的调用堆栈,但对于Delphi 5应用程序来说它看起来是一样的.

  • 让我想知道为什么Application首先在Forms单元中声明(Controls使用Forms,Forms使用Controls)... (3认同)

jac*_*ate 12

Application实例是在Vcl.Controls.pas单元的InitControls过程中创建的.

procedure InitControls;
begin
...
  Application := TApplication.Create(nil);
...
Run Code Online (Sandbox Code Playgroud)

InitControls在同一单元的初始化部分中调用:

initialization
  ...
  InitControls;
Run Code Online (Sandbox Code Playgroud)