2011-09-24 57 views
2

我遇到了函數GetProcessHandleCount()的奇怪行爲。 起初,我把所有進程的快照系統,因爲它是在MSDN描述:GetProcessHandleCount的值不正確

HANDLE hProcessSnap; 
HANDLE hProcess; 
PROCESSENTRY32 pe32; 
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
pe32.dwSize = sizeof(PROCESSENTRY32); 
if(!Process32First(hProcessSnap, &pe32)) 
    { 
     CloseHandle(hProcessSnap); 
     return 0; 
    } 

然後我走的流程的快照,並通過使用功能 GetProcessHandleCount計數打開的句柄:

int count_of_handles=0; 
DWORD dwHandleCount=0; 
do { 
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,pe32.th32ProcessID); 
    GetProcessHandleCount(hProcess,&dwHandleCount); 
    count_of_handles+=dwHandleCount; 
    if(hProcess != NULL) 
     CloseHandle(hProcess); 
    } while(Process32Next(hProcessSnap, &pe32)); 

我在Windows 7 x64中檢查了這個程序。程序顯示count_of_handles〜16000,但實際上這個值是〜100 000(如果相信Windows任務管理器)。
然後我在Windows XP x32(由VMWare)執行這個程序,並且count_of_handles是〜9000(但實際上它是〜8000)。
我的代碼有什麼問題?謝謝。

回答

0

首先,GetProcessHandleCount可能會返回零(表示錯誤)。這可能會導致結果低於預期。這可能是由於OpenProcess失敗而引起的(您不檢查那個)。

+0

特別是如果枚舉進程沒有足夠的權限來查詢目標進程的句柄計數。我不確定任務管理器是否以與其他程序相同的權限運行。 –

+0

幸運的是,還有另外一個winapi函數 - GetPerformanceInfo。有用。 –

0

除了Jon's reason,從任務管理器的價值包括手柄在內核開放 - 這些將不包括在您的總跨進程。


對於這種事情Process Explorer有效得多。包括能夠在Process Explorer列表中列出每個進程和內核system僞進程的打開句柄。