我如何修复“程序发出命令但命令长度不正确”。调用Process32First()时出错?

时间:2013-01-24 01:17:56

标签: c++ sizeof alignof

GetLastError告诉我,我收到“程序发出命令,但命令长度不正确。”调用Process32First()时出错(参见下面的代码)。我找到一篇看起来很有帮助的帖子(http://social.msdn.microsoft.com/Forums/is/vcgeneral/thread/6f43716f-fdd3-4c92-bfba-6a23178c32bf),但我不确定这是不是我的问题

我尝试过构建一个只包含"stdafx.h"<iostream><Windows.h><TlHelp32.h>的程序来测试__alignof(PROCESSENTRY32),但我仍然得到一个值4.不确定这是否正确。

以下是失败的代码:

HANDLE hProcess;
PROCESSENTRY32 pe32;

cout << "Size of PROCESSENTRY32 is: " << sizeof(PROCESSENTRY32) << "\r\n"; // 556
cout << "Align of PROCESSENTRY32 is: " << __alignof(PROCESSENTRY32) << "\r\n"; // 4

if ( !(hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) ) {
    cout << "CreateToolhelp32Snapshot() failed: " << GetLastError() << "\r\n";
    return (HANDLE)NULL;
} else {
    cout << "CreateToolhelp32Snapshot() succeeded.\r\n";
}

if (Process32First(hProcess, &pe32)) {
    do {
        cout << pe32.th32ModuleID;
    } while (Process32Next(hProcess, &pe32));
} else {
    cout << "Process32First() failed: " << GetLastError() << "\r\n";
}

1 个答案:

答案 0 :(得分:1)

来自Process32First上的文档:

  

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

我没有看到你在代码中这样做,我怀疑这是问题所在。解决它:

pe32.dwSize = sizeof pe32;
if (Process32First(...))

许多winapi结构强制执行此操作背后的原因是为了以后灵活地在结构上添加更多内容,但让函数通过检查以前版本的已知大小来了解正在使用的版本。