BOOL CEnumProcessDlg::GetProceesCtrl()
{
PROCESSENTRY32 proc={0};
CString strID;
int idx=0;
HANDLE hProcess=NULL;
proc.dwSize=sizeof(PROCESSENTRY32);
HANDLE hSnay=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnay==INVALID_HANDLE_VALUE)
return FALSE;
BOOL bRed=Process32First(hSnay,&proc);
while(bRed)
{
idx=m_ListCtrl.InsertItem(m_ListCtrl.GetItemCount(),_T(""));
m_ListCtrl.SetItemText(idx,0,proc.szExeFile);
strID.Empty();
strID.Format(_T("%d"),proc.th32ProcessID);
m_ListCtrl.SetItemText(idx,1,strID); hProcess=OpenProcess(PROCESS_VM_READ|PROCESS_VM_WRITE,FALSE,proc.th32ProcessID);
int m=GetLastError();
if(hProcess)
{
TCHAR szPath[MAX_PATH]={0};
GetModuleFileNameEx(hProcess,NULL,szPath,MAX_PATH);
m_ListCtrl.SetItemText(idx,2,szPath);
}
bRed=Process32First(hProcess,&proc);
}

return TRUE;
}
在win7上,OpenProcess返回错误码为0,在xp返回错误码为87,提示为参数不正确。结果把第一个参数改PROCESS_ALL_ACCESS,问题依旧,怎么解决?

解决方案 »

  1.   

    Process32First之后,要调用Process32Next才能获得进程信息
      

  2.   

    给个例子:
    BOOL CMyDlg::EnumProcess()
    {
    m_Process.ResetContent();
    HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
        if(!snapshot)
    {
    MessageBox("创建快照失败!");
    return FALSE;
    }
    PROCESSENTRY32 procsee32; 
    BOOL err;
    int Processnum=0;
    CString str="";
    err=Process32First(snapshot,&procsee32);
    if(err==FALSE)
    {
    MessageBox("获取第一个进程信息失败!");
    return FALSE;
    }
        
    do{ 
    err=Process32Next(snapshot,&procsee32);
    m_arr.Format("PID : %d",procsee32.th32ProcessID);
    int i=m_arr.GetLength(); switch(i)
    {
    case 10:str="      name : "; //PID  4位数
    break;
    case 9:str="       name : ";   // PID 3位数
    break;
    case 8:str="        name : ";  //PID 2位数
    break;
            case 7:str="         name : ";  //PID 1位数
    break; }
    str+=procsee32.szExeFile;
    m_arr+=str;
    m_Process.AddString(m_arr);
    Processnum++; }while(err);
        
    str="";
    str.Format("所有进程数 : %d ",Processnum);
    SetDlgItemText(IDC_STATIC,str);
    return TRUE;
    }
      

  3.   

    Process32First之后,要调用Process32Next才能获得其他进程信息