Как передать вектор в массив указателей winapi? - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу прекратить использование памяти, выделенной вручную, для работы со всеми winapi. для тестирования я пытаюсь изменить свой код. но я получаю

не существует подходящего преобразования из вектора DWORD в DWORD *.

std::vector<DWORD> aProcesses;
DWORD cbNeeded;
if (!EnumProcesses(aProcesses, aProcesses.capacity(), &cbNeeded))
{
    return 1;
}
for (auto& p : aProcesses)
{
    std::cout << p << std::endl;
}

Ручная Выделенная память ниже

    DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
{
    return 1;
}


// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name and process identifier for each process.

for (i = 0; i < cProcesses; i++)
{
    if (aProcesses[i] != 0)
    {
        std::cout << aProcesses[i] << std::endl;

}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018
if (!EnumProcesses(aProcesses, aProcesses.capacity(), &cbNeeded))

не будет работать хорошо.Во-первых, вам нужно передать aProcesses.data() в качестве первого параметра, а число * байтов * aProcess может содержать 2-е: aProcesses.size() * sizeof(DOWD).

Если cbNeeded> = aProcess.size() * sizeof(DWORD)после вызова вам нужно изменить размер vector на cbNeeded / sizeof(DWORD) и снова вызвать EnumProcesses(), чтобы убедиться, что вы получили все процессы.

0 голосов
/ 15 ноября 2018

A vector не является указателем на DWORD; однако, это vector случайно содержит один, так что вы можете

if (!EnumProcesses(aProcesses.data(), aProcesses.capacity(), &cbNeeded))

, если ваш компилятор компилируется для версии C ++ 11 Standard или более новой или

if (!EnumProcesses(&aProcesses[0], aProcesses.capacity(), &cbNeeded))

если это не так.

Но это просто приводит к компиляции

Есть логические проблемы, которые еще предстоит решить.

const int MAX_PROCESSES = 1024; // very few Windows systems will exceed 1024 processes

std::vector<DWORD> aProcesses(MAX_PROCESSES); // allocate space
DWORD cbNeeded;
if (!EnumProcesses(aProcesses.data(), 
                   aProcesses.capacity() * sizeof(DWORD), // size in bytes, not elements  
                   &cbNeeded))
{
    return 1;
}
//for (auto& p : aProcesses) Not all processes may have been filled. The unused portions 
//are zeroed, so this is safe, but wasteful
for (int i = 0; i < cbNeeded / sizeof(DWORD); ++i)
{
    std::cout << aProcesses[i] << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...