Visual c++ PROCESSENTRY32局部变量上的零内存?
我需要列举正在运行的进程,一时想知道为什么我的代码不起作用:Visual c++ PROCESSENTRY32局部变量上的零内存?,visual-c++,winapi,Visual C++,Winapi,我需要列举正在运行的进程,一时想知道为什么我的代码不起作用: PROCESSENTRY32 ProcEntry; ZeroMemory (&ProcEntry, sizeof (PROCESSENTRY32)); //problem ProcEntry.dwFlags = sizeof(PROCESSENTRY32); HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Snapshot
PROCESSENTRY32 ProcEntry;
ZeroMemory (&ProcEntry, sizeof (PROCESSENTRY32)); //problem
ProcEntry.dwFlags = sizeof(PROCESSENTRY32);
HANDLE Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Snapshot == INVALID_HANDLE_VALUE)
return false;
if (Process32First(Snapshot, &ProcEntry))
....
问题是Process32First总是返回FALSE,因为出现了错误\u BAD\u LENGTH错误
一旦我删除了零内存线,一切都开始正常工作。所以问题是,为什么是零内存造成的?它应该只在X的地址中填充Z字节的内存。我经常在winapi指针式结构中使用它,这次我没有意识到它是一个局部变量,但这并不能解释问题,是吗
谢谢
克拉
编辑:另外,我发现代码只有在调试版本中才能正常工作,一旦我将其编译为发布版本,它就会再次出现错误://您不能将整个
PROCESSENTRY32
结构归零,因为它是自描述的-您必须设置dwSize
。从样本中:
您应该设置
dwSize
,而不是dwFlags
ProcEntry.dwFlags = sizeof(PROCESSENTRY32);
应该是
ProcEntry.dwSize = sizeof(PROCESSENTRY32);
@sharptooth-OP的代码没有设置
dwSize
,因此它作为0传递给Win32 API,因此OP注意到Win32错误代码“错误长度”。如果根本没有设置dwSize
(当没有ZeroMemory
时),则struct具有浮动dwSize
,这可能有效,也可能无效。是的,我知道它的大小必须设置。我不知道为什么我设置标志值而不是大小(我猜是一些自动完成功能和错误选择的选项)。这当然奏效了。那么我能假设零内存可以安全地用于局部变量吗?@Steve Townsend:我明白了。我花了一分钟盯着代码看,才意识到他设置了错误的成员变量。@Kra-是的,只要您设置了所需的字段就可以了。诅咒智能感知自动完成,对吗?@Kra:是的,你可以使用ZeroMemory()
以及memset()
-查看这个相关问题:
ProcEntry.dwSize = sizeof(PROCESSENTRY32);