C++ |如何在函数结果中返回所有 PID?
C++ | How to return all PID's in a result of function?
我希望使用c++从函数返回所有当前运行的进程ID的数组。
我正在用以下函数枚举列表:
DWORD* xEnumProcs(){
PROCESSENTRY32 pe32;
HANDLE snapshot = NULL;
DWORD pid[1024];
DWORD* pointer;
pointer = pid;
int I = 0;
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot != INVALID_HANDLE_VALUE) {
pe32.dwSize = sizeof(PROCESSENTRY32);
if (Process32First(snapshot, &pe32)) {
do {
pid[I] = pe32.th32ProcessID;
I++;
} while (Process32Next(snapshot, &pe32));
}
CloseHandle(snapshot);
}
return pointer;
}
我不确定这样做是否正确。我试图在另一个函数中使用这个数组,像这样:
void HandleProcs(){
DWORD* xNewProcs = xEnumProcs;
}
这是我在最后一个函数体的一行中收到的错误:
'initializing' : cannot convert from 'DWORD *(__cdecl *)(void)' to 'DWORD *'
1> There is no context in which this conversion is possible
我想你已经得到了答案,但是为了学习,在这里比较一下C版本:
#include <stdio.h> // printf
#include <Windows.h>
#include <Tlhelp32.h>
DWORD *EnumProcs(size_t *n)
{
DWORD *pids = NULL;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
*n = 0;
if (snapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32 = { sizeof(pe32) };
if (Process32First(snapshot, &pe32))
{
do { ++*n; } while (Process32Next(snapshot, &pe32));
pids = calloc(*n, sizeof(pe32.th32ProcessID));
*n = 0;
Process32First(snapshot, &pe32); // Maybe check return value
do { pids[(*n)++] = pe32.th32ProcessID; }
while (Process32Next(snapshot, &pe32));
}
CloseHandle(snapshot);
}
return pids;
}
int main()
{
size_t i, n;
DWORD *pids = EnumProcs(&n);
for (i = 0; i < n; i++)
{ printf("%un", pids[i]); }
free(pids);
}
与c++版本:
#include <iostream> // std::cout
#include <vector> // std::vector, like List<T> in C# (or ArrayList<T> in Java)
#include <Windows.h>
#include <Tlhelp32.h>
std::vector<DWORD> EnumProcs()
{
std::vector<DWORD> pids;
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
if (Process32First(snapshot, &pe32))
{
do
{
pids.push_back(pe32.th32ProcessID);
} while (Process32Next(snapshot, &pe32));
}
CloseHandle(snapshot);
}
return pids;
}
int main()
{
std::vector<DWORD> pids = EnumProcs();
for (size_t i = 0; i < pids.size(); i++)
{ std::cout << pids[i] << std::endl; }
}
请注意c++版本是如何完全不同的——并且不使用指针。
在学习两种语言之前,先把其中一种学好。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 如果存在进程,是否保证 kill(pid, 0) 返回 0
- 按名称返回 PID
- 需要当前进程的PID, getpid()返回-1
- waitpid返回ECHILD -但是pid是有效的
- C++ |如何在函数结果中返回所有 PID?