特定的VCL应用程序崩溃,很少,显然是自发的,我强烈怀疑这是因为主窗体的窗口句柄正在重新创建,以响应操作系统的一些外部触发器。
我确实知道如果主窗体的窗口句柄要改变那么麻烦肯定会随之而来(因为后台线程将消息发布到这个句柄)。
但是我想知道如何在我开始修改代码之前重现这个bug,如果只是这样我可以确认这是崩溃的原因,症状与报告的相符,并且代码更改确实修复了它。 (同样,如果操作系统无法触发对TCustomForm.RecreateWnd
的调用,我需要为崩溃找到一些其他解释。是的,我可以将CM_RECREATEWND
发布到主窗体但是这只是引出问题。)
(我知道将消息从后台线程发布到VCL线程的正确方法是使用AllocateHWnd
创建一个纯粹用于此目的的隐藏消息窗口 - 这是我提议的修复。)
通过将桌面样式从 Windows XP 更改为 Windows Classic {> TCustomListView
,我发现了类似的错误RecreateWnd
EM>。但我还没有找到这样的方法来触发RecreateWnd
上的TCustomForm
。 (我花了相当多的时间阅读VCL代码,但我必须遗漏一些东西。)
要点:
在操作系统的刺激下,VCL最终在RecreateWnd
上调用TCustomForm
? (如果有所不同,我对Windows 7特别感兴趣。)
如果操作系统有这样的刺激,我可以证明它是否会引起观察到的症状。如果肯定没有,那么我可以证明窗户娱乐不是原因。
答案 0 :(得分:1)
如果您的表单被拥有或作为另一个正在被销毁的窗口的父级,Windows将销毁您的表单。
这将导致您的表单处理被破坏。
但是由于你的表单还在,Delphi会在下次重新创建句柄。