gpt4 book ai didi

windows - 什么外部事件触发 TCustomForm.RecreateWnd?

转载 作者:可可西里 更新时间:2023-11-01 13:14:30 27 4
gpt4 key购买 nike

一个特定的 VCL 应用程序崩溃,这种情况很少见,而且显然是自发的,我强烈怀疑这是因为正在重新创建主窗体的窗口句柄以响应操作系统的某些外部触发。

我确实知道,如果主窗体的窗口句柄发生变化,那么麻烦肯定会随之而来(因为后台线程向该句柄发送消息)。

但我想知道如何在我着手进行代码更改以修复它之前重现此错误,如果只有这样我可以确认这是崩溃的合理原因,症状与报告的相符,并且代码更改确实修复了它。 (此外,如果操作系统无法触发对 TCustomForm.RecreateWnd 的调用,我需要为崩溃找到一些其他解释。是的,我可以将 CM_RECREATEWND 发布到主要形式,但这只是在回避问题。)

(我知道从后台线程向 VCL 线程发布消息的正确方法是使用 AllocateHWnd 创建一个纯粹为此目的的隐藏消息窗口 - 这是我提出的修复方法。)

我在 TCustomListView 的后代中看到了类似的错误,其中 RecreateWnd 是通过将桌面样式从 Windows XP 更改为 < em>Windows 经典版。但是我还没有找到这样的方法来触发 TCustomForm 上的 RecreateWnd。 (我花了相当多的时间通读 VCL 代码,我一定遗漏了一些东西。)

总结:

在操作系统的什么刺激下,VCL 最终在 TCustomForm 上调用 RecreateWnd? (我对 Windows 7 特别感兴趣,如果它有所作为的话。)

如果操作系统有这样的刺激,我可以证明它是否导致观察到的症状。如果确实没有,那么我可以证明窗口娱乐不是原因。

最佳答案

如果窗体拥有或父级为另一个正在被销毁的窗口,则 Windows 将销毁您的窗体。

这将导致您的表单句柄被破坏。

但是由于您的表单仍然存在,Delphi 将在下次重新创建句柄。

关于windows - 什么外部事件触发 TCustomForm.RecreateWnd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27400973/

27 4 0
文章推荐: php - Laravel 5 查看 Composer 服务提供者,从通配符中排除前缀
文章推荐: javascript - 类似于 NakedObjects 的系统?
文章推荐: html - 仅用于