我想获得所有正在运行的进程的列表,如
example.exe
example2.exe
等等……下面是我试过的代码
WCHAR* GetAllRunningProccess()
{
PROCESSENTRY32 pe32;
HANDLE snap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0
);
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &pe32);
do {
return pe32.szExeFile;
} while (Process32Next(snap, &pe32));
}
std::wcout << GetAllRunningProccess() << std::endl;
它只打印
[System Process]
你写的代码不像生成器函数一样工作以生成多个值。它只在返回第一个值时退出。你不能从一个函数返回超过一次。
do {
return ...; // This will both exit the loop and exit the function.
} while(...);
尽管协程提供了co_yield
来完成此任务。
修复…
最基本的修复将是重新设计你的函数,使其返回字符串的vector
,而不仅仅是一个字符串。
std::vector<std::string> GetAllRunningProcesses()
{
PROCESSENTRY32 pe32;
HANDLE snap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0
);
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &pe32);
std::vector<std::string> result;
do {
result.push_back(pe32.szExeFile);
} while (Process32Next(snap, &pe32));
CloseHandle(snap);
return result;
}
然后,你可以这样调用它:
for (const auto& processName : GetAllRunningProcesses()) {
std::cout << processName << std::endl;
}
在你的代码中
do {
return pe32.szExeFile;
} while (Process32Next(snap, &pe32));
我很确定在执行这个while循环之后,一旦编译器返回一个值,然后退出函数并继续执行主体中的代码,而不是回到循环,因此只得到一个输出(一个进程)。
更新你的代码,然后测试。