windows - Delphi TForm OnCreate 被多次调用

标签 windows delphi dll

希望我能很好地解释这个问题!

我正在尝试将 ReWire 音频设备实现为 Delphi .dll。如果您不知道 ReWire 是什么,请不要担心。重要的是我的代码编译成 .dll,并且我从 ReWire 系统调用我的 .dll 以打开显示器,检查显示器是否打开,然后再次关闭它。

当我接到启动电话时,我会执行以下操作:

  if not Assigned(form) then
    form := TMyForm.Create(nil);
  form.Show;

其中 form 是我的 Delphi 库内的一个全局变量(也许有问题?)。我已经连接了 MyFormOnCreate 事件来执行一些有趣的操作,例如准备一组我想要使用的内容。

到目前为止一切都很好。我的表单中有一个小按钮,可以打开一个 TOpenDialog。我发现一旦该对话框关闭,OnCreate 事件就会以某种方式在我的表单中再次触发!

我检查了 OnDestroy 没有被调用,所以我不知道为什么 OnCreate 再次被调用。

不幸的是,我不太确定哪些信息是相关的,但这是第一次(首次设置表单时)的调用堆栈:

First call stack

正如预期的那样,ReWire 正在调用我的 .dll 以启动面板应用程序,因此我创建了表单。太好了,事情看起来不错。

然后在我的表单中,我打开一个小对话框,选择一个文件,并执行一些操作。在左侧字段之外,再次调用 OnCreate,这是这次的调用堆栈:

Second call stack

这是一场疯狂的通话聚会! Reaper(底部)是我用来测试应用程序的 ReWire 主机,但我不知道堆栈跟踪内部发生了什么,因为它都不是我的代码。突然,当我认为不应该调用该事件时,该事件就被调用了,因为 OnDestroy 甚至没有被调用。

我能想到的唯一另一件重要的事情是,如果我打印出发件人的地址,它每次都会不同,因此它会以某种方式再次创建或一些东西,但我检查过我只调用了 MyForm.Create 一次。

关于这种事情如何发生有什么想法吗?

最佳答案

在第一个堆栈跟踪中,OnCreate 调用之前是对 TCustomForm.Create() 的调用,这是正确的行为。在第二个堆栈跟踪中,OnCreate 调用之前是对 TObject.Create() 的调用,这是不正确的行为。这让我认为按钮 OnClick 事件处理程序中的某些内容要么正在构造一个具有错误 VMT 的对象,要么通常会损坏内存并导致错误跳转到恰好被占用的代码通过您的 TForm 类。无论哪种方式,请仔细检查您的 OnClick 逻辑是否存在错误。

关于windows - Delphi TForm OnCreate 被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10377786/

相关文章:

sql-server - 通过 Delphi DLL 连接到 SQL 时 Delphi 10.2 Tokyo 程序抛出 216 错误

macos - 如何使用Indy获取本地IP4地址?

我可以为所有 Linux 编译器使用一个 Linux .so 吗?

c++ - 将结构传递给动态加载的 dll

windows - QNetworkRequest 不工作

php - Uncaught Error : Call to undefined function pg_connect() using XAMPP on Windows

python-3.x - 哪个版本的 Miniconda 有适用于 64 位 Windows 的 Python 3.6?

c++ - windows下串口读取的时序

string - 为什么程序在分配字符串后崩溃

c# - 如何使 .dll 可用于 C# 和 Excel VBA