10

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

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

我在这里想念什么?

4

2 回答 2

14

从代码中解决这个问题很容易。您只需对TApplication.Create. 例如,使用 IDE 的 Find in Files 功能。

但是你总是可以偷懒,让调试器来做。

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

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

普通 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 应用程序看起来是一样的。

于 2013-02-07T17:37:09.407 回答
12

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

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

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

initialization
  ...
  InitControls;
于 2013-02-07T17:39:17.113 回答