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

时间:2013-02-07 17:32:57

标签: delphi debugging initialization delphi-5

创建Application实例的位置和时间? (同样适用于Screen实例)。

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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:13)

从代码中解决这个问题很容易。您只需对TApplication.Create进行文本搜索。例如,使用IDE的“在文件中查找”功能。

但是你总是可以懒惰并让调试人员去做。

  1. 启用调试DCU。
  2. TApplication.Create
  3. 中设置断点
  4. 运行。
  5. 当程序中断时,查看调用堆栈。您将看到TApplication对象是从InitControls单元中的Controls实例化的。 InitControlsinitialization单元的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;