hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pWtspi[i].ProcessId/*pe32.th32ProcessID*/ );
if( hProcess == NULL ){
CloseHandle( hProcess );
}else{
GetModuleFileNameEx(hProcess,NULL,(LPWSTR)&szProcessName,MAX_PATH); 
CloseHandle( hProcess );
}
这是我取得进程文件名的代码,通过枚举获取的进程PID等信息。
WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE ,0, 1, &pWtspi, &dwCount)问题:
编译调试程序正常,用户名和文件路径、优先级都能获取,但单独运行(在文件夹中双击)程序则取不到部分进程的文件路径和优先级。
在开发环境中运行程序也能取得全部数据。

解决方案 »

  1.   

    应该是权限问题,你提升你的程序的权限为debug权限试试
    BOOL EnableDebugPrivilege() 

    HANDLE hToken; 
    BOOL fOk=FALSE; 
    if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)) 

    TOKEN_PRIVILEGES tp; 
    tp.PrivilegeCount=1; 
    if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tp.Privileges[0].Luid)) 
    printf("Can't lookup privilege value.\n"); 
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; 
    if(!AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL)) 
    printf("Can't adjust privilege value.\n"); 
    fOk=(GetLastError()==ERROR_SUCCESS); 
    CloseHandle(hToken); 

    return fOk; 

     
      

  2.   

    是权限问题,还有一种解决方法hProcess = OpenProcess( /*PROCESS_ALL_ACCESS*/
                                   PROCESS_QUERY_INFORMATION |
                                        PROCESS_VM_READ, FALSE
    , pWtspi[i].ProcessId/*pe32.th32ProcessID*/ );
    if( hProcess == NULL ){
        CloseHandle( hProcess );
    }else{
        GetModuleFileNameEx(hProcess,NULL,(LPWSTR)&szProcessName,MAX_PATH); 
        CloseHandle( hProcess );
    }查了好多资料,解决了,也贴出来。
    分结楼上了,谢谢你!
      

  3.   

    PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, FALSE本来想写个红字,代码不认,哈哈