2013-12-23 84 views
0

我正在尝试汇总Qt中所有进程的列表。为此,我使用Windows API。 下面的代码演示了我的努力迄今:为什么GetProcessImageFileName返回null而不是进程的地址?

QList<QString> frmProcess::GetAllRunningProcesses() 
{ 
    HANDLE hSysSnapshot = NULL; 
    HANDLE processHandle; 
    PROCESSENTRY32 proc; 


    proc.dwSize = sizeof(proc); 
    hSysSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0); 
    Process32First(hSysSnapshot,&proc); 
    proc.dwSize = sizeof(proc); 

    ui->listWidget->clear(); 
    LPWSTR processPath; 
    list.clear(); 
    do 
    { 
     //This block of code is to get each process's path and store it in a list 
     //PROCESS_ALL_ACCESS is commented out since it fails the program on start-up 

     processHandle = OpenProcess(/*PROCESS_ALL_ACCESS*/PROCESS_QUERY_INFORMATION | 
           PROCESS_VM_READ, 
           FALSE, proc.th32ProcessID); 

     GetProcessImageFileName(processHandle,processPath,MAX_PATH); 
     procpaths.append(QString::fromWCharArray(processPath)); 

     list.append(QString::fromWCharArray(proc.szExeFile)); 

    } while(Process32Next(hSysSnapshot,&proc)); 

    CloseHandle(hSysSnapshot); 
    return list; 
} 

在上面的代码贴出来,我想获得尽可能多的信息,我可以得到一个过程,对于这个我的帮助汇集进程名称的CreateToolhelp32Snapshot,然后通过GetProcessImageFileName获得他们的路径。所有这些都发生在每个毫秒的计时器滴答事件中。
如果我运行该程序,几秒钟后它崩溃,我得到分段错误。
我也试过调试,因为我无法获得任何与任何进程相关的路径!
而令我惊讶的是,我只能得到每个过程路径的空字符串! 我在做什么错?

回答

1

您的GetProcessImageFileName未收到适当的参数。 processPath必须指向有效的缓冲区。

TCHAR processPath[MAX_PATH] = { 0 }; 
GetProcessImageFileName(processHandle, processPath, _countof(processPath)); 

此外,你想检查返回值,看看你是否成功。

+0

我试过LPWSTR processPath [MAX_PATH],但它给编译时错误!陈述##################################### 错误:无法转换'WCHAR ** {aka wchar_t (HANDLE,LPWSTR,DWORD)' GetProcessImageFileName(processHandle,processPath,MAX_PATH);参数'2'到'LPWSTR {aka wchar_t *}'的'**}'到'DWORD GetProcessImageFileNameW' ^ – Breeze

+0

虽然你的解决方案工作得很好。如果名称是unicode,TCHAR将无法将它们存储正确? – Breeze

+0

'TCHAR'与'GetProcessImageFileName'恰当匹配。如果你想使用'WCHAR'(出于某种原因我不知道),那么你可以在'GetProcessImageFileNameW'中使用它。 –

相关问题