Прямые данные в несуществующий массив - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу узнать количество запущенных процессов, используя функцию EnumProcesses из библиотеки psapi. Функция запрашивает массив, который получит список идентификаторов процесса. Он также записывает общее количество байтов найденных данных в данную переменную. Я не хотел список процессов, просто их номер. Я сделал следующее.

DWORD listSize;
DWORD a;
EnumProcesses( &a, 1000*sizeof(DWORD), &listSize ) ;
listSize/=sizeof(DWORD);
printf("%d",listSize);

Это записывает реальное количество процессов в listSize, однако программа перестает работать после этого. Мне было интересно, есть ли способ немедленно отправить полученные данные в забвение и просто получить их номер.

1 Ответ

0 голосов
/ 30 сентября 2019

Не возможно. Однако предоставление достаточно большого массива не является большой проблемой для современных систем.

Я рекомендую написать вспомогательную функцию, которая оборачивает все это для вас с помощью контейнера динамического размера, чтобы вы могли обрабатывать случаи, когда большесуществуют процессы, которые могут не содержать ваш исходный массив:

DWORD GetNumberOfProcesses()
{
    std::vector<DWORD> processes;
    DWORD size = 0;
    DWORD bytesReturned = 0;
    while (bytesReturned == size)
    {
        size += 1024 * sizeof(DWORD);
        processes.resize(size / sizeof(DWORD));
        if (!EnumProcesses(processes.data(), size, &bytesReturned))
        {
            return -1;
        }
    }
    return bytesReturned / sizeof(DWORD);
}
...