1

次のコードは、「firefox.exe」を検出して正常に終了したにもかかわらず、常に127(「指定されたプロシージャが見つかりませんでした。」)を出力するのはなぜですか?

#include<Windows.h>
#include <TlHelp32.h>
#include<iostream>
using namespace std;

int main( int, char *[] )
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (_tcscmp(entry.szExeFile, TEXT("firefox.exe")) == 0)
            {  
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
                DWORD d = GetLastError();
                cout<<d<<'\n';
                TerminateProcess(hProcess,0);

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}
4

2 に答える 2

4

を確認する前に、特定の関数の戻り値を確認する必要がありますGetLastError

GetLastErrorは、API 関数によって設定された最後のエラー コードを常に返します。ただし、すべての関数が成功したときに最後のエラー コードを設定するわけではありません。したがって、 の結果GetLastErrorは、プログラムの他の部分で設定されたエラー コードである可能性があります。

したがって、あなたの場合、 MSDN docs for によるとOpenProcess、関数は失敗した場合に戻りNULLます。GetLastErrorしたがって、 ifOpenProcessが 以外を返すかどうかを確認する必要はありませんNULL

last-error コード現在のスレッドに固有のものであることに注意してください。

于 2012-05-28T18:37:12.917 に答える
1

関数が失敗した場合、戻り値は NULL です。拡張エラー情報を取得するには、GetLastError を呼び出します。

これは Windows API の一般的なパターンです。GetLastError は多くの場合、関数が失敗した場合にのみ有効です... (GetFileSize や GetFileType などの一部の関数は、返された値が有効かどうかを確認するために GetLastError を呼び出す必要があります)。

于 2012-05-28T18:51:12.027 に答える