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

10

Application实例和Screen实例是在何时何地创建的?(同样适用于Screen实例)。

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

我在这里错过了什么吗?

2个回答

15

从代码中很容易找到这个信息。你只需在文本中搜索 TApplication.Create,例如使用IDE的“在文件中查找”功能。

但你也可以偷懒,让调试器来完成它。

  1. 启用Debug DCUs。
  2. TApplication.Create 中设置断点。
  3. 运行。

当程序中断时,查看调用栈。你会发现 TApplication 对象是由 Controls 单元中的 InitControls 实例化的。而 InitControls 是从 Controls 单元的 initialization 段调用的。

纯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应用程序,它将完全相同。


3
让我想知道为什么应用程序在第一次声明中放在Forms单元中(Controls使用Forms,Forms使用Controls)... - kobik
控件只在实现中使用表单。TApplication 必须在 TForm 之上声明,因为它在其接口部分引用了 TForm。 - David Heffernan

12

应用程序实例是在Vcl.Controls.pas单元的InitControls过程中创建的。

procedure InitControls;
begin
...
  Application := TApplication.Create(nil);
...

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

initialization
  ...
  InitControls;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接