创建Application
实例的位置和时间?
(同样适用于Screen
实例)。
我在Forms
或System
initialization
部分看不到任何内容
在Application.Initialize
之前的CPU窗口中,我看到对@_InitExe
(SysInit)的调用 - 它导致_StartExe
(系统)和大量asm
代码 - 这是据我所知,没有创建Application
实例。
我在这里缺少什么?
答案 0 :(得分:13)
从代码中解决这个问题很容易。您只需对TApplication.Create
进行文本搜索。例如,使用IDE的“在文件中查找”功能。
但是你总是可以懒惰并让调试人员去做。
TApplication.Create
。当程序中断时,查看调用堆栈。您将看到TApplication
对象是从InitControls
单元中的Controls
实例化的。 InitControls
从initialization
单元的Controls
部分调用TScreen.Create
。
普通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
执行相同的操作,您会看到InitControls()
对象也在{{1}}中实例化。
我不会试图解释所有这一切。我认为这里有足够的信息和建议供您从这里开始工作。虽然这是来自XE3应用程序的调用堆栈,但对于Delphi 5应用程序来说它看起来是一样的。
答案 1 :(得分:11)
Application实例是在Vcl.Controls.pas单元的InitControls过程中创建的。
procedure InitControls;
begin
...
Application := TApplication.Create(nil);
...
在同一单元的初始化部分中调用InitControls:
initialization
...
InitControls;