OpenProcess总是异常
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才能获得进程信息
------解决方案--------------------
给个例子:
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; }
------解决方案--------------------