【问题标题】:Where and When is Application (TApplication) instance created?应用程序 (TApplication) 实例在何时何地创建?
【发布时间】:2023-03-26 04:37:01
【问题描述】:

Application 实例是在何时何地创建的? (Screen 实例也是如此)。

我在FormsSystem initialization 部分看不到任何内容。
Application.Initialize 之前的 CPU 窗口中,我看到了对 @_InitExe (SysInit) 的调用 - 这导致 _StartExe (System) 和一大堆 asm 代码 - 它不会将 Application 实例创建为据我所知。

我在这里错过了什么?

【问题讨论】:

    标签: delphi debugging initialization delphi-5


    【解决方案1】:

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

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

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

    当程序中断时,查看调用堆栈。您将看到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) 项目1.项目1 :749933aa kernel32.BaseThreadInitThunk + 0x12 :76f09ef2 ntdll.RtlInitializeExceptionChain + 0x63 :76f09ec5 ntdll.RtlInitializeExceptionChain + 0x36

    TScreen.Create做同样的事情,你会看到TScreen对象也在InitControls()中实例化。

    我不会尝试解释所有这些。我认为这里有足够的信息和建议供您从这里解决所有问题。虽然这是来自 XE3 应用程序的调用堆栈,但它对于您的 Delphi 5 应用程序看起来是一样的。

    【讨论】:

    • 让我想知道为什么应用程序首先在表单单元中声明(控件使用表单,表单使用控件)...
    • 控件仅在实现中使用表单。 TApplication 必须声明得比 TForm 更高,因为它在其接口部分引用了 TForm。
    【解决方案2】:

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

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

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

    initialization
      ...
      InitControls;
    

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多