Вывод всех процессов через Process32FirstW - ничего не выводит и закрывает консоль

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2023

Код компилируется, но ничего не выводит (Кроме TEST) и завершает программу с кодом 3221225477

Нужно выводить именно в юникоде.

Process32First работает корректно, но процессы с кириллицей пропускает.

Код:

#include <windows.h>
#include <tlhelp32.h>
#include <string>
#include <iostream>
#include <io.h>
#include <fcntl.h>
using namespace std;


wstring getProcesses () {

    LPPROCESSENTRY32W process;
    HANDLE tool = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    wstring temp;

        if (tool == INVALID_HANDLE_VALUE) return L"?";
        process->dwSize = sizeof(LPPROCESSENTRY32W);

        Process32FirstW(tool, process);
        temp = process->szExeFile + L'\n';
        while (Process32NextW(tool, process))  {
            temp += process->szExeFile;
            temp += L'n';
        }

    return temp;
}

int main () {


    setmode(_fileno(stdout), _O_U16TEXT);
    setmode(_fileno(stdin),  _O_U16TEXT);
    setmode(_fileno(stderr), _O_U16TEXT);

    wcout << L"TEST - Я Ъ ї Ю Ґ";

    wcout << getProcesses();

    wcin.get();

    return 0;
}

Ответы

▲ 0Принят

Ваш код должен создать переменную PROCESSENTRY32W, и передать указатель на нее в Process32FirstW, Process32NextW.

wstring getProcesses () {

    PROCESSENTRY32W process{};                          // fix #1
    HANDLE tool = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    wstring temp;

    if (tool == INVALID_HANDLE_VALUE) return L"?";
    process.dwSize = sizeof(PROCESSENTRY32W);          // fix #2

    Process32FirstW(tool, &process);                   // fix #3

    // ...

    while (Process32NextW(tool, &process))             // fix #4
    {
         // ...
    }

    return temp;
}