Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ PROCESSENTRY32局部变量上的零内存?_Visual C++_Winapi - Fatal编程技术网

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