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

我确实知道,如果要更改主窗体的窗口句柄,那么肯定会遇到麻烦(因为后台线程将消息发布到此句柄)。

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

(我知道将消息从后台线程发布到VCL线程的正确方法是,纯粹出于此目的,使用AllocateHWnd创建一个隐藏的消息窗口-这是我建议的解决方法。)

我看到TCustomListView的后代出现类似的错误,其中通过将 table 面样式从Windows XP更改为Windows Classic触发了RecreateWnd。但是我还没有找到在RecreateWnd上触发TCustomForm的方法。 (我花了相当多的时间来阅读VCL代码,我肯定会丢失一些东西。)

摘要:

在来自操作系统的什么刺激下,VCL最终会在RecreateWnd上调用TCustomForm吗? (如果这有所作为,我对Windows 7尤其感兴趣。)

如果操作系统提供了这样的刺激,我可以证明它是否引起了所观察到的症状。如果绝对没有,那么我可以证明不是窗外娱乐不是原因。

最佳答案

如果窗体是另一个窗体的所有者或父窗体的父窗体,则Windows将销毁您的窗体。

这将导致您的窗体的句柄被破坏。

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

10-07 20:50