2011-11-17 32 views
0

我想在ctypes的幫助下使用python中的WinAPI(CreateProcessA)。應該在WinAPI調用中使用python中的結構之前填充零嗎?

爲了正確調用函數,我應該事先做一些結構(例如STARTUPINFO,PROCESSINFORMATION)。

我知道當你想在WinAPI中使用一個結構時,你應該使用ZeroMemory來用零填充結構。

我應該在python中做同樣的事情嗎?

我正在閱讀的書中沒有提供這個問題的答案。

回答

3

這取決於。我不認爲有任何單一的要求。讓我們考慮在CreateProcess的背景下給出的兩個例子。

lpStartupInfo

此參數標有註解__in。這意味着信息正從呼叫者傳遞到CreateProcess。在這種情況下,調用者有責任確保所有字段都被適當地初始化。一個簡單而常見的方法是將整個結構初始化爲零,然後修改您想要與零不同的字段。

lpProcessInformation

此參數標有註解__out。這意味着信息從CreateProcess傳遞給調用者。您在調用之前執行的任何初始化都會被忽略合同是CreateProcess不會讀取您傳遞的結構的內容,但會完全初始化該結構。在這種情況下,我認爲在將結構傳遞給CreateProcess之前,初始化結構是毫無意義的。

當然,如果CreateProcess失敗,那麼返回的值是不確定的,您不應該讀取它們。但即使您在調用之前已初始化了流程信息結構,您也不能保證CreateProcess不會被部分寫入。在API函數失敗的情況下,除非文檔另有說明,否則不應讀取它返回的任何內容。

摘要

總之我會建議你初始化所有傳遞給函數的輸入值,而不是初始化輸出值。

+0

謝謝。也感謝@eryksun。我已經知道了。 – Searene

0

是的。用零填充結構的做法是廣泛傳播的數據準備實踐的一部分。