Application
实例和Screen
实例是在何时何地创建的?(同样适用于Screen
实例)。
我在Forms
或System
的initialization
部分中没有看到任何内容。
在Application.Initialize
之前的CPU窗口中,我看到了对@_InitExe
(SysInit)的调用 - 这导致了_StartExe
(System)和一大堆asm
代码 - 据我所知,它并没有创建Application
实例。
我在这里错过了什么吗?
Application
实例和Screen
实例是在何时何地创建的?(同样适用于Screen
实例)。
我在Forms
或System
的initialization
部分中没有看到任何内容。
在Application.Initialize
之前的CPU窗口中,我看到了对@_InitExe
(SysInit)的调用 - 这导致了_StartExe
(System)和一大堆asm
代码 - 据我所知,它并没有创建Application
实例。
我在这里错过了什么吗?
从代码中很容易找到这个信息。你只需在文本中搜索 TApplication.Create
,例如使用IDE的“在文件中查找”功能。
但你也可以偷懒,让调试器来完成它。
TApplication.Create
中设置断点。当程序中断时,查看调用栈。你会发现 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应用程序,它将完全相同。
应用程序实例是在Vcl.Controls.pas单元的InitControls过程中创建的。
procedure InitControls;
begin
...
Application := TApplication.Create(nil);
...
InitControls 在同一单元的初始化部分中被调用:
initialization
...
InitControls;