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

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

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

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

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

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

未经测试的代码 – 目前我还没有VS2008。

 [DllImport("User32")] private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); private static List m_handles = new List(); 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 } } 

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

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