2012-05-28 66 views
1

爲什麼下面的代碼總是打印出127(「指定的程序找不到」),即使它找到「firefox.exe」並終止它成功?GetLastError 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; 
} 
+0

'TerminateProcess()'沒有任何成功。它毫不費力地將它殺死。讓我們聽聽它的損壞的配置文件! – Deanna

回答

4

你需要檢查GetLastError前檢查返回值的特定功能

GetLastError將始終返回由API函數設置的最後一個錯誤代碼。但是,並非所有函數都會在成功時設置最後的錯誤代碼。因此,GetLastError的結果可能是在程序的其他部分設置的錯誤代碼。

因此,在您的情況下,根據OpenProcess的MSDN文檔,如果失敗,該函數將返回NULL。因此,如果OpenProcess返回的不是NULL,則無需查看GetLastError

請注意,最新錯誤代碼是當前線程唯一的。

1

如果函數失敗,返回值爲NULL。要獲得擴展錯誤 信息,請調用GetLastError。

這是Windows API在一個共同的模式,GetLastError函數通常只有當函數失敗有效...(如GetFileSize和GetFileType某些功能需要您調用GetLastError說,如果返回值是有效的)