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

Gen*_*ene 5 c# compact-framework gdi windows-mobile 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);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 2

这更多的是一个建议而不是一个答案。

您可能要求将所有“句柄”方法放置在一个单独的类中(我有一个名为 、 等的类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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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