其他分享
首页 > 其他分享> > c – 是否有可能找出泄漏GDI对象的内容

c – 是否有可能找出泄漏GDI对象的内容

作者:互联网

我在Embarcadera RAD Studio 2010(C)中有一个应用程序.是否有可能看到它会泄漏GDI对象?当文本设置为Bold时,树形结构菜单正在泄漏GDI对象.我的猜测是首先创建“原始”文本,然后是一个以粗体显示的实例,第一个是“被遗忘”并泄露.

编辑:因为在AQTime中没有报告任何泄漏,即使通过查看Taskmanager是obvoius,我追踪了正在创建而不是释放GDI对象的代码片段.

...

Msg.WParam=(int)PhysicalListView->Canvas->Handle;
PhysicalListView->Dispatch(&Msg);

... 

PhysicalListView是指向TListView的指针.据我所知,以T开头的类是标准Embarcadero类的一部分(对吗?).

当我在列表视图中选择了一个具有未修饰文本的子节点时,一切正常.但是,当一个或多个孩子有粗体或带下划线的文本时,例如GDI计数在调度调用后不会减少.

所以我猜测这是TListView类中的一个错误.我不知道这是否适用于WinForms或它是否使用它自己的解决方案?

此外,这发生在调试模式下.我将在编译发布版本时检查问题是否消失.如果是这样,它表示TListView的调试版本中存在泄漏.

编辑2:我想我已经发现了这个问题.发送的初始消息包括WM_PAINT,在阅读之后,该消息不应由客户端应用程序发送,而是由系统使用.所以我将其更改为WM_PRINT并且泄漏消失了.我不知道为什么使用WM_PAINT,或许我错过了它的一些功能……任何想法为什么他们会使用WM_PAINT?

解决方法:

AQTime是我的首选工具.它是一个分析器,带来了比GDI泄漏检测更多的功能. RAD Studio XE附带标准版AQTime.对于Pro版本,您需要支付更多费用.

标签:c,gdi,cbuilder
来源: https://codeday.me/bug/20190903/1796932.html