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才能获得进程信息
------解决方案--------------------
给个例子:
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才能获得进程信息