我正在尝试在Qt中汇集所有进程的列表。为此我正在使用Windows API。 以下代码演示了我到目前为止的努力:
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
的帮助下汇集流程名称,然后通过{{获取路径1}}。所有这些都发生在每毫秒的计时器滴答事件中
如果我运行该程序,几秒钟后它崩溃,我就会出现分段错误
我也试过调试,因为我无法获得任何与任何过程有关的路径!
令我惊讶的是,我只为每个过程的路径获取空字符串!
我做错了什么?
答案 0 :(得分:1)
您的GetProcessImageFileName
没有收到正确的论据。 processPath
必须指向有效的缓冲区。
TCHAR processPath[MAX_PATH] = { 0 };
GetProcessImageFileName(processHandle, processPath, _countof(processPath));
此外,您要检查返回的值以查看是否成功。