我的纯 DotNET 库作为插件在非托管桌面应用程序中运行。我收到了稳定的(虽然低)崩溃报告流,这些报告似乎表明 GDI 句柄存在问题(错误消息中的字体等。恢复为系统字体,各种控件的显示崩溃,不久后发生大规模崩溃) )。
我的窗体几乎没有控件,但我在用户控件中进行了大量 GDI+ 绘图。有什么好方法可以知道我正在使用多少个句柄,甚至泄漏了多少个句柄?
谢谢, 大卫
最佳答案
以 GDIView 开头从Ray Vega的回答中,我发现this tip :
[DllImport("User32")]
extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);
public static void GetGuiResourcesGDICount()
{
//Return the count of GDI objects.
Console.WriteLine("GDICount"+GetGuiResources(System.Diagnostics.Process.GetCurrentProcess().Handle, 0));
}
private void button1_Click(object sender, System.EventArgs e)
{
GetGuiResourcesGDICount();
}
GDIView 通知字体对象正在泄漏;然后,我将对 GetGuiResources
的调用添加到我们的日志记录代码中,以检测触发对象创建的时间点。
在我们的例子中,当Label
控件的父UserControl
隐藏在背景窗口中时,我们更新了Label
控件的文本。这会导致 GDI 泄漏字体句柄。为了解决这个问题,我们更改了逻辑,除非标签当前在屏幕上可见,否则不更新标签。为了确定它是否可见,我们记录了 UserControl
上次绘制的时间。
关于.net - DotNET 应用程序中的 GDI 句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2483011/