2

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

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

这是失败的代码:

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";
}
4

1 回答 1

1

从上的文档Process32First

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

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

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

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

于 2013-01-24T01:20:54.530 回答