我想停止使用手动分配的内存来处理所有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;
}
答案 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()
以确保已全部程序。