2

GetLastError は、「プログラムはコマンドを発行しましたが、コマンドの長さが正しくありません。」Process32First() 呼び出し時のエラー (以下のコードを参照)。参考になる投稿を 1 つ見つけました (http://social.msdn.microsoft.com/Forums/is/vcgeneral/thread/6f43716f-fdd3-4c92-bfba-6a23178c32bf) が、これが私の問題かどうかはわかりません.

"stdafx.h"<iostream><Windows.h>および<TlHelp32.h>to testのみを含むプログラムを作成しようとしました__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";
}
4

1 に答える 1

1

ドキュメントからProcess32First

呼び出し元のアプリケーションは、PROCESSENTRY32 の dwSize メンバーを構造体のサイズ (バイト単位) に設定する必要があります。

あなたのコードでそれをしているのを見ません。それが問題だと思います。修理する:

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

多くの winapi 構造体に対するこの必須アクションの背後にある理由は、後で構造体にさらに追加する柔軟性のためですが、以前のバージョンの既知のサイズをチェックすることによって、どのバージョンが使用されているかを関数に知らせます。

于 2013-01-24T01:20:54.530 に答える