2017-10-04 118 views
-1

documentation狀態:什麼可能導致EnumProcesses()失敗?

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

但它沒有給出任何例子,如何功能可能可能會失敗。

進行單元測試,我需要可靠地造成這樣的局面,使EnumProcesses()失敗。

+0

進行單元測試,你應該有磕碰出越來越過程的方法的一種方式。 – chris

+1

對於託管代碼,曾經有Moles/Pex(現在是Microsoft Fakes)提供系統服務的替代品,以顯示可重複的行爲。雖然我沒有意識到任何這樣的本地代碼框架,但我會花時間研究這些框架的可用性。 – IInspectable

+0

每個winapi函數都可能失敗。沒有例外規格。它幾乎沒有什麼好處,當然不會用於EnumProcesses,並且測試應用程序是否成功終止異常是所需的。 –

回答

3

最喜歡的功能,如果你傳遞無效的參數,它可能會失敗。在這種情況下,這意味着一個比您告訴它的大小更小的PID數組或者接收計數的NULL指針。這樣做的目的有點冒險,因爲您不知道該功能是否使用SEH來防止這種情況發生,或者它是否會發生崩潰。

內部函數有調用到NTDLL得到處理信息之前分配一些內存,這可能會導致功能失效,如果沒有足夠的可用內存。

你應該叫一個輔助函數來抽象EnumProcesses掉內存/反正重試細節,這將是在需要的時候,以模擬故障的好地方。

如果你確實需要的功能本身失敗,你可以用類似微軟走彎路或IAT鉤子鉤住它...

+0

我希望這可以通過簡單地刪除進程權限或類似的東西會改變'EnumProcesses'環境條件,使其無法完成。對於收到的計數,「NULL」會導致函數失敗,但正如你寫的那樣,它也可能會崩潰(如果不是現在,那麼可能在未來的Windows版本中)。與發佈代碼相比,「模擬」失敗將需要不同的代碼路徑進行測試(某些#ifdef和@HansPassant建議的),所以我想避免這種情況。 – zett42

+0

但是你應該已經有一個輔助函數封裝EnumProcesses,所以你不必等直接在你的主代碼恕我直言,應對重試。 – Anders

+0

是的,我有。但在這個包裝器中,我仍然需要#ifdef(不同的代碼路徑)或添加一個參數來模擬失敗,不是嗎? – zett42

相關問題