5

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

4

1 回答 1

2

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

您可以要求将所有“句柄”方法放在一个单独的类中(我有一个名为User32,coreDLL等的类)。

然后,您可以在每次使用资源时增加一个计数器,或者将您创建的每个新句柄添加到私有管理列表中,然后再将句柄传回。

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

未经测试的代码 - 我现在没有 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
  }
}

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

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

于 2013-10-12T20:33:37.607 回答