Application
实例是在何时何地创建的?(同样适用于Screen
实例)。
Forms
我在or System
initialization
部分没有看到任何内容。
在之前的 CPU 窗口中Application.Initialize
,我看到了对@_InitExe
(SysInit) 的调用——这导致了_StartExe
(System) 和大量代码——据我所知,asm
它并没有创建实例。Application
我在这里想念什么?
Application
实例是在何时何地创建的?(同样适用于Screen
实例)。
Forms
我在or System
initialization
部分没有看到任何内容。
在之前的 CPU 窗口中Application.Initialize
,我看到了对@_InitExe
(SysInit) 的调用——这导致了_StartExe
(System) 和大量代码——据我所知,asm
它并没有创建实例。Application
我在这里想念什么?
从代码中解决这个问题很容易。您只需对TApplication.Create
. 例如,使用 IDE 的 Find in Files 功能。
但是你总是可以偷懒,让调试器来做。
TApplication.Create
。当程序中断时,查看调用堆栈。您将看到该TApplication
对象是从单元中实例化InitControls
的Controls
。并从单元的部分InitControls
调用。initialization
Controls
普通 VCL 应用程序的完整调用堆栈如下所示:
Vcl.Forms.TApplication.Create(nil) Vcl.Controls.InitControls Vcl.Controls.Vcl.Controls System.InitUnits System._StartExe(???,???) SysInit._InitExe($5A81BC) 项目1.项目1 :749933aa kernel32.BaseThreadInitThunk + 0x12 :76f09ef2 ntdll.RtlInitializeExceptionChain + 0x63 :76f09ec5 ntdll.RtlInitializeExceptionChain + 0x36
对 做同样的事情TScreen.Create
,你会看到TScreen
对象也在InitControls()
.
我不会试图解释这一切。我认为这里有足够的信息和建议供您从这里解决所有问题。虽然这是来自 XE3 应用程序的调用堆栈,但它对于您的 Delphi 5 应用程序看起来是一样的。
Application 实例是在 Vcl.Controls.pas 单元的 InitControls 过程中创建的。
procedure InitControls;
begin
...
Application := TApplication.Create(nil);
...
InitControls 在同一个单元的初始化部分被调用:
initialization
...
InitControls;