2013-10-11 61 views
5

我們爲我們的Windows Forms UI渲染引擎開發了一個小型測試套件,該套件允許在以自動方式運行測試用例時測量性能並檢測內存泄漏。現在我們也想檢查手柄泄漏。在桌面平臺上,我們可以使用此代碼:確定GDI句柄和USER對象的數量

[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

這不僅僅是一個答案而是一個建議。

您可能需要將所有「句柄」方法放在單獨的類中(我有一個類叫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 
    } 
} 

再一次,這只是一個想法。我以前從未遇到過這個問題,所以我不知道它的工作效果如何,或者它會因某些「未知的」原因而失敗。

這就是我在邏輯上如何開始項目。

+0

據我瞭解您的方法,這將需要我重寫我們的應用程序中的整個資源處理,這是目前由Windows窗體(位於'Pen','Graphics'和'Bitmap'內的某處)處理的 - 僅用於爲了測試資源句柄泄漏的緣故。由於這種測試通常是在發佈新版本之前執行的,我寧願觀察現有工具的應用程序行爲。無論如何,感謝您的建議 - 我很欣賞這一努力。 – Gene

+0

當然在部署之前不要這樣做,不。但是,對於您的應用程序,這將是一個更好的設計。考慮未來的版本。 :) – jp2code