确定 GDI 句柄和用户对象的数量

本文关键字:对象 用户 GDI 句柄 确定 | 更新日期: 2023-09-27 18:34:48

我们为Windows Forms UI呈现引擎开发了一个小型测试套件,它允许在以自动方式运行测试用例时测量性能和检测内存泄漏。现在我们也想检查手柄泄漏。在桌面平台上,我们可以使用以下代码:

[DllImport("User32")]
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags);
using (var process = Process.GetCurrentProcess())
{
  var gdiHandles = GetGuiResources(process.Handle, 0);
  var userHandles = GetGuiResources(process.Handle, 1);
}

此方法似乎在Windows Mobile中不可用。是否有另一种方法可以在Windows Mobile/CE上以编程方式确定这些值?

确定 GDI 句柄和用户对象的数量

这与其说是一个答案,不如说是一个建议。

你可以要求你所有的"handle"方法都放在一个单独的类中(我有一个名为User32coreDLL等的类(。

然后,可以在每次使用资源时递增计数器,也可以在将创建的每个新句柄传递回该句柄之前将创建的每个新句柄添加到专用管理列表中。

现在,在项目关闭之前,请确保计数器恢复为零或列表中的所有句柄都已关闭。

未经测试的代码 - 我目前这里没有VS2008。

[DllImport("User32")]
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags);
private static List<IntPtr> m_handles = new List<IntPtr>();
public static IntPtr[] GetGuiResources() {
  using (var process = Process.GetCurrentProcess())
  {
    var gdiHandles = GetGuiResources(process.Handle, 0);
    m_handles.Add(gdiHandles);
    var userHandles = GetGuiResources(process.Handle, 1);
    m_handles.Add(userHandles);
  }
  return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] };
}
public static void Close() {
  for (int i = m_handles.Count - 1; -1 < i; i--) {
     var handle = m_handles[i];
     // release your handle
  }
}

同样,这只是一个想法。我以前从未遇到过这个问题,所以我不知道它的效果如何,或者它是否会因为某些"我不知道"的原因而失败。

这就是我从逻辑上开始项目的方式。