Я пытаюсь объединить список всех процессов в 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 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
. И все это происходит в событии таймера каждые миллисекунды.
Если я запустил программу, через пару секунд он сработает, я получаю ошибку сегментации.
Я также пробовал отладку, так как я не мог получить никакого пути, связанного с каким-либо процессом!
И к моему удивлению, я получаю пустые строки для пути каждого процесса! Что я делаю не так?
GetProcessImageFileName
не получает правильный аргумент. processPath
должен указывать на действительный буфер.
TCHAR processPath[MAX_PATH] = { 0 };
GetProcessImageFileName(processHandle, processPath, _countof(processPath));
Кроме того, вы хотите проверить возвращаемое значение, чтобы убедиться, что вы преуспели или нет.