微软专家:重贴CreateToolhelp32Snapshot的问题。
各位老大,我从msdn上搞了一段程序,显示系统内所有的process,为什么只显示我自己用户级的,不显示system级的?我用的是winxp,但是win2000下也一样。如svchost,system idle都显示不出来,被toolsapi过滤掉了吗?!我在CreateToolhelp32Snapshot中设置了TH32CS_SNAPALL,也不行。
请帮助!
另外,我可给得分不够,怎么把可用份转换成提问分?
谢谢!
代码如下:(我注释的部分好像有问题)
void __fastcall TMainForm::btRefreshClick(TObject *Sender)
{
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
TListItem *ListItem;
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE){
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if(Process32First(hProcessSnap, &pe32)){
DWORD dwPriorityClass;
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = {0};
do
{
bGotModule = GetProcessModule(pe32.th32ProcessID,
pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
if (bGotModule)
{
HANDLE hProcess;
hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE, pe32.th32ProcessID);
dwPriorityClass = GetPriorityClass (hProcess);
CloseHandle (hProcess);
ListItem = lvProcessList->Items->Add();
ListItem->Caption = me32.szModule;
ListItem->SubItems->Add(IntToStr(pe32.th32ProcessID));
ListItem->SubItems->Add(IntToStr(pe32.cntThreads));
ListItem->SubItems->Add(IntToStr(pe32.pcPriClassBase));
ListItem->SubItems->Add(me32.szExePath);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
CloseHandle (hProcessSnap);
}
//---------------------------------------------------------------------------
bool __fastcall TMainForm::GetProcessModule (DWORD dwPID, DWORD dwModuleID,
LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
BOOL bRet = FALSE;
BOOL bFound = FALSE;
HANDLE hModuleSnap = NULL;
MODULEENTRY32 me32 = {0};
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
return (FALSE);
me32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hModuleSnap, &me32)){
do
{
// if (me32.th32ModuleID != dwModuleID)
//如果不注释,什么也显示不出来
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
while (!bFound && Module32Next(hModuleSnap, &me32));
bRet = bFound;
}
else{
bRet = FALSE;
}
CloseHandle (hModuleSnap);
return (bRet);
}