我只是试图撤销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” 我无法弄清楚问题是什么。有什么建议吗?
答案 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 <tlhelp32.h><br/>
#pragma pack(pop)