Почему GetProcessImageFileName возвращает ноль вместо адреса процесса?

0

Я пытаюсь объединить список всех процессов в 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. И все это происходит в событии таймера каждые миллисекунды.
Если я запустил программу, через пару секунд он сработает, я получаю ошибку сегментации.
Я также пробовал отладку, так как я не мог получить никакого пути, связанного с каким-либо процессом!
И к моему удивлению, я получаю пустые строки для пути каждого процесса! Что я делаю не так?

Теги:
winapi
qt5

1 ответ

1
Лучший ответ

GetProcessImageFileName не получает правильный аргумент. processPath должен указывать на действительный буфер.

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

Кроме того, вы хотите проверить возвращаемое значение, чтобы убедиться, что вы преуспели или нет.

  • 0
    Я попытался LPWSTR processPath [MAX_PATH], но он дал ошибки времени компиляции! констатируя ошибку ###########################################: невозможно преобразовать WCHAR ** {aka wchar_t * *} 'в' LPWSTR {aka wchar_t *} 'для аргумента' 2 'в' DWORD GetProcessImageFileNameW (HANDLE, LPWSTR, DWORD) 'GetProcessImageFileName (processHandle, processPath, MAX_PATH); ^
  • 0
    хотя ваше решение работает просто отлично. Что делать, если имена в юникоде, TCHAR не сможет их правильно хранить?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню