确定GDI句柄和USER对象的数量

时间:2013-10-11 08:51:52

标签: c# windows-mobile compact-framework gdi handle-leak

我们为Windows窗体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上以编程方式确定这些值?

1 个答案:

答案 0 :(得分:1)

这是一个建议而非答案。

您可以要求将所有“句柄”方法放在一个单独的类中(我有一个名为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
  }
}

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

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