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

标签 delphi debugging initialization delphi-5

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

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

我在这里缺少什么?

最佳答案

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

但是你总是可以偷懒并让调试器来完成它。

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

当程序中断时,查看调用堆栈。您将看到 TApplication对象从 InitControls 实例化在 Controls单元。和InitControlsinitialization 调用Controls 部分单位。

普通 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.Create 做同样的事情,您会看到TScreen对象也在 InitControls() 中实例化.

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

关于delphi - 应用程序 (TApplication) 实例在何时何地创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757320/

相关文章:

delphi - 如何获取 TClientDataset 到另一个 TClientDataset 的更改?

javascript - 启动时打开 Karma debug.html 页面

python - PySide.QtGui RuntimeError : '__init__' method of object's base class not called . ..但它是

arrays - 隐式 do 循环数组初始化

delphi - 在delphi中测试泛型的类型

delphi - Delphi中的“免费”功能是什么?

delphi - 如何在delphi 2010中将中文字符串转换为十六进制并达到与delphi 2007 mbcs相同的结果

c# - WPF C# 应用程序部署 - 运行 exe 时没有任何反应

ios - pdf 的操作扩展

c++ - 通过静态成员函数在 C++ 中初始化非常量静态成员变量