c++ - 调用 Process32First() 时如何修复 "The program issued a command but the command length is incorrect."错误?

标签 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";
}

最佳答案

来自 Process32First 上的文档:

The calling application must set the dwSize member of PROCESSENTRY32 to the size, in bytes, of the structure.

我没有看到您在代码中这样做,我怀疑这是问题所在。修复它:

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

许多 winapi 结构的强制操作背后的原因是为了以后可以灵活地向结构中添加更多内容,但通过检查先前版本的已知大小让函数知道正在使用哪个版本。

关于c++ - 调用 Process32First() 时如何修复 "The program issued a command but the command length is incorrect."错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14492352/

相关文章:

c++ - 在构造函数旁边声明的属性

c++ - 有利于限制 Qt 对象的范围吗?

alignment - 如何在 D 中对齐结构成员?

c++ - alignof运算符有什么用?

c++ - CMAKE 忽略所有关于指定编译器的设置

C++ cin 在没有我告诉它这样做的情况下打印变量

c++ - 有没有办法通过类型单独获取 vector 的字节大小?

c++ - 静态或动态类型用于 "sizeof expr"?

c - 为什么重新定义 sizeof 有效