用VS2008做的一个MFC程序,我想获取另外一个进程列表中的内容.调试时可以正常运行,运行生成的程序总是得不到句柄.而之前我用VS2005做的相同的功能的Win32程序,不论在调试还是直接运行都能正常获得句柄.pChiWnd=pWnd->FindWindowEx( pWnd->m_hWnd, NULL, NULL, NULL );
GetWindowThreadProcessId( pChiWnd->m_hWnd, &PID );
hProc=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
if(!hProc){
AfxMessageBox( L"获取进程句柄操作失败!" );
return;
}else{
pLvItem = (LVITEM*)VirtualAllocEx(hProc, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
pszItemBuf=(TCHAR*)VirtualAllocEx(hProc, NULL, TEXTBUFLEN, MEM_COMMIT, PAGE_READWRITE);
if((!pLvItem)||(!pszItemBuf)){
AfxMessageBox(L"无法分配内存!");
return;
}
}
如果改动 PROCESS_ALL_ACCESS ,那下面的内存分配又会出现问题.请问是不是要在VS的项目属性中进行一些设置?

解决方案 »

  1.   

    如果用PROCESS_ALL_ACCESS, OpenProcess不会总返回成功,跟你的当前用户权限有关系,最好先提升下当前的进程级别,然后在调用OpenProcess,
      

  2.   

    是啊,OpenProcess在VS2008中调试时能取到句柄,可是运行时就取不到了.Win32程序的级别比MFC程序要高吗?奇怪
    请问怎么提升进程级别?
      

  3.   

    提升Debug权限
    BOOL EnablePrivilege(LPCSTR lpName, BOOL fEnable)
    {
            HANDLE hObject;
            LUID Luid;
            TOKEN_PRIVILEGES NewStatus;        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hObject))
                    return FALSE;        if (LookupPrivilegeValue(NULL, lpName, &Luid))
            {
                    NewStatus.Privileges[0].Luid = Luid;
                    NewStatus.PrivilegeCount = 1;
                    NewStatus.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;                AdjustTokenPrivileges(hObject, FALSE, &NewStatus, 0, 0, 0);
                    
                    CloseHandle(hObject);
                    return TRUE;
            }
            
            return FALSE;
    }
    EnablePrivilege(SE_DEBUG_NAME,TRUE);