如何将向量传递给指针数组winapi?

时间:2018-11-15 04:43:38

标签: c++ windows visual-studio winapi

我想停止使用手动分配的内存来处理所有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 :(得分:0)

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;
}

答案 1 :(得分:0)

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

效果不好。首先,您需要传递aProcesses.data()作为第一个参数,而* bytes * aProcess的数量可以作为第二个参数:aProcesses.size() * sizeof(DOWD)

如果通话后cbNeeded> = aProcess.size() * sizeof(DWORD),则必须将vector的大小调整为cbNeeded / sizeof(DWORD),然后再次致电EnumProcesses()以确保已全部程序。