GetLastError 127

时间:2012-05-28 18:22:30

标签: windows winapi

为什么下面的代码总是打印出来127(“无法找到指定的程序。”)即使它找到“firefox.exe”并成功终止它?

#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;
}

2 个答案:

答案 0 :(得分:4)

您需要在检查GetLastError之前检查特定功能的返回值。

GetLastError将始终返回API函数设置的最后一个错误代码。但是,并非所有函数都会在成功时设置上一个错误代码。因此GetLastError的结果可能是在程序的其他部分设置的错误代码。

因此,在您的情况下,根据OpenProcess的MSDN文档,如果失败,函数将返回NULL。因此,如果GetLastError返回OpenProcess以外的其他内容,则无需查看NULL

请注意,当前线程的最后一个错误代码 是唯一的。

答案 1 :(得分:1)

  

如果函数失败,则返回值为NULL。要获得扩展错误   信息,调用GetLastError。

这是Windows API中的常见模式,GetLastError通常仅在函数失败时才有效...(某些函数如GetFileSize和GetFileType要求您调用GetLastError来判断返回的值是否有效)