为啥控件的类名不好?不能创建新的 GDI 句柄?

Posted

技术标签:

【中文标题】为啥控件的类名不好?不能创建新的 GDI 句柄?【英文标题】:Why class name of control is bad? Can not create new GDI handles?为什么控件的类名不好?不能创建新的 GDI 句柄? 【发布时间】:2015-06-10 11:22:42 【问题描述】:

我有一个由 Delphi 语言创建的程序。这在 Windows XP SP3 上运行。

多次打开和停止程序后(~600 到 700 次)(只打开和停止,不做任何事情)。我的程序会出错:

无法输入到系统的文本框。 无法点击某些按钮。

当出现错误时,错误将一直存在,直到计算机重新启动。 (重启程序无法解决这个bug)

我查看了一些系统信息,结果如下:

正常情况下,总 GDI 句柄小于 GDI 句柄:(使用 GDIView 检测)

大小写正常:3513 个 GDI 句柄 发生错误时:3410

控件的类名错误:(使用 spy++ 检测)

普通:文本框的类名是Tedit。

发生错误时:“Toolbar_Customize”或“”或任何值(此值是awlay 更改)==> 我认为因为那样,我无法将值输入到文本框。

有时,当出现此错误时,我无法启动另一个 Windows 程序。

请帮助我。 P/s:有不清楚的地方欢迎评论

【问题讨论】:

Delphi 的哪个版本?另外,当您说您的程序“不做任何事情”时,它究竟做了什么?可以显示出处吗? 我使用的是 Delphi 2007。我只启动和停止程序多时间。不要执行程序的其他功能。 【参考方案1】:

这让我想起了以下问题(RM_GetObjectInstance 消息导致的资源泄漏): http://qc.embarcadero.com/wc/qcmain.aspx?d=90511

最后一条评论中有一个解决方法。

【讨论】:

仅供参考,该问题已在 XE3 中修复。

以上是关于为啥控件的类名不好?不能创建新的 GDI 句柄?的主要内容,如果未能解决你的问题,请参考以下文章

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

c#,求助!在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

搭建DirectUi开发平台

为啥我不能内联创建新的 Java 数组? [复制]

为啥我不能内联创建新的 Java 数组? [复制]

在创建窗口句柄之前,不能对控件调用 Invoke 或 BeginInvoke