读书人

OpenProcess总是异常

发布时间: 2012-03-24 14:00:46 作者: rapoo

OpenProcess总是错误
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,问题依旧,怎么解决?

[解决办法]
Process32First之后,要调用Process32Next才能获得进程信息
[解决办法]
给个例子:

C/C++ code
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;}
[解决办法]
探讨
Process32First之后,要调用Process32Next才能获得进程信息

读书人网 >VC/MFC

热点推荐