在Windows 7中调用Process32First时出现ERROR_BAD_LENGTH

时间:2011-06-29 13:54:15

标签: c++ windows-7

我只是试图撤销Windows XP中的一些旧代码,它生成所有正在运行的进程的列表,但在Windows 7上失败。在继续之前,这是代码:

#include <windows.h>
#include <tlhelp32.h>

int main()
{
    HANDLE hSnap, hTemp;
    PROCESSENTRY32 pe;

    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if(Process32First(hSnap, &pe)) {
        do {
            ...
            }
        } while(Process32Next(hSnap, &pe));
    }
    ...
}

我检查了哪个功能失败,结果发现它是Process32First。 GetLastError()返回24:“ERROR_BAD_LENGTH” 我无法弄清楚问题是什么。有什么建议吗?

2 个答案:

答案 0 :(得分:9)

来自MSDN:http://msdn.microsoft.com/en-us/library/ms684834(VS.85).aspx

调用应用程序必须将PROCESSENTRY32的dwSize成员设置为结构的大小(以字节为单位)。

要检索有关同一快照中记录的其他进程的信息,请使用Process32Next函数。


编辑: 你可能想做这样的事情:

PROCESSENTRY32 pe = {0};
pe.dwSize = sizeof(PROCESSENTRY32);

答案 1 :(得分:1)

tlhelp32.h中调用时WIN64中存在错误:

如果在包含#pragma之前某处有tlhelp32.h打包指令,则会生成大小错误的PROCESSENTRY32结构。 然后可能发生任何事情,包括Process32First失败,甚至崩溃。

尝试以这种方式包含tlhelp32.h

 #pragma pack(push,8) /* Work around a bug in tlhelp32.h in WIN64, which generates the wrong structure if packing has been changed */<br/>
 #include &lt;tlhelp32.h&gt;<br/>
 #pragma pack(pop)