2012-06-18 75 views
1

我有一點點混亂,由於從CreateProcess()GetLastError()衝突的返回值。當我以類似於以下的方式使用CreateProcess()時,它成功並似乎完成了其所需的任務。然而,GetLastError()仍然返回訪問被拒絕。CreateProcess的成功,但GetLastError()返回訪問被拒絕

如果訪問被拒絕,爲什麼它似乎完成任務。相反,如果CreateProcess()成功,爲什麼GetLastError()返回訪問被拒絕?

或者是我使用GetLastError()不正確?我是否應該在CreateProcess()返回失敗值時使用它? (我對以下行爲的理由是我認爲最好是安全而不是遺憾)

SetLastError(0); 
    hello = CreateProcess(_T("C:\\Windows\\System32\\cmd.exe"), 
     _T("C:\\Windows\\System32\\cmd.exe /C ant debug"), 
     NULL,NULL,false,0,NULL, 
     _T("C:\\My\\Directory"),&siStartupInfo, &piProcessInfo); 
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_ALLOCATE_BUFFER 
     |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(), 
     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
     (LPTSTR)&errorText, 0, NULL); 
    AfxMessageBox(errorText); 

這種行爲是否正常?在CreateProcess()文檔中,當CreateProcess()失敗時,它提到使用GetLastError(),但它沒有提到相反的內容。不批評文件,只是想澄清一下。

這發生在CreateProcess()第二參數是否NULL與否。也許它與cmd.exe權限有關?如果是這樣的話,不應該CreateProcess()失敗?謝謝。

+2

是的,你GetLastError'的'使用是不正確的錯誤。你應該只在'CreateProcess'失敗時使用它。 'CreateProcess'可能(並且確實)使用可以設置最後一個錯誤的API,並且它沒有義務將它重置爲0,因爲它返回一個表示成功的值。 – Erik

+0

謝謝你的迴應。我只是將它重置爲零,以表明它不能來自CreateProcess()之前的函數() – JHowzer

回答

3

GetLastError

該設置最後的錯誤代碼的每個函數的文檔的返回值部分中的文檔注意到在其下的功能設置最後一個錯誤代碼的條件。大多數設置線程最後錯誤代碼的函數在失敗時設置它。但是,某些函數也會在成功執行時設置最後的錯誤代碼。 [重點煤礦]

我覺得你得到的經驗的結果,因爲,uppon成功,CreateProcess沒有設定誤差值GetLastError回報。相反,你要GetLastError調用返回被稱爲另一個功能設置較早

+0

謝謝。如果我在調用CreateProcess之前立即調用SetLastError(0),它不應該返回0而不是5嗎? – JHowzer

+3

@JHowzer - 這取決於如何實現CreateProcess。如果它調用其他函數,那麼也可以設置錯誤值 – Attila

1

GetLastError僅當文檔聲明它有意義時纔有意義。

GetLastError返回的Win32線程與SetLastError設置最後一個錯誤。由於函數只能設置或清除上次記錄的錯誤,如果沒有發生,最後一個錯誤可能包含較早的錯誤,這是不相關的。

據記載,如果失敗CreateProcess將設置最後一個錯誤,而不是是否成功。所以你應該忽略它。

+0

感謝您的回覆。 – JHowzer