我想在ctypes的幫助下使用python中的WinAPI(CreateProcessA)。應該在WinAPI調用中使用python中的結構之前填充零嗎?
爲了正確調用函數,我應該事先做一些結構(例如STARTUPINFO,PROCESSINFORMATION)。
我知道當你想在WinAPI中使用一個結構時,你應該使用ZeroMemory來用零填充結構。
我應該在python中做同樣的事情嗎?
我正在閱讀的書中沒有提供這個問題的答案。
我想在ctypes的幫助下使用python中的WinAPI(CreateProcessA)。應該在WinAPI調用中使用python中的結構之前填充零嗎?
爲了正確調用函數,我應該事先做一些結構(例如STARTUPINFO,PROCESSINFORMATION)。
我知道當你想在WinAPI中使用一個結構時,你應該使用ZeroMemory來用零填充結構。
我應該在python中做同樣的事情嗎?
我正在閱讀的書中沒有提供這個問題的答案。
這取決於。我不認爲有任何單一的要求。讓我們考慮在CreateProcess
的背景下給出的兩個例子。
lpStartupInfo
此參數標有註解__in
。這意味着信息正從呼叫者傳遞到CreateProcess
。在這種情況下,調用者有責任確保所有字段都被適當地初始化。一個簡單而常見的方法是將整個結構初始化爲零,然後修改您想要與零不同的字段。
lpProcessInformation
此參數標有註解__out
。這意味着信息從CreateProcess
傳遞給調用者。您在調用之前執行的任何初始化都會被忽略合同是CreateProcess
不會讀取您傳遞的結構的內容,但會完全初始化該結構。在這種情況下,我認爲在將結構傳遞給CreateProcess
之前,初始化結構是毫無意義的。
當然,如果CreateProcess
失敗,那麼返回的值是不確定的,您不應該讀取它們。但即使您在調用之前已初始化了流程信息結構,您也不能保證CreateProcess
不會被部分寫入。在API函數失敗的情況下,除非文檔另有說明,否則不應讀取它返回的任何內容。
摘要
總之我會建議你初始化所有傳遞給函數的輸入值,而不是初始化輸出值。
是的。用零填充結構的做法是廣泛傳播的數據準備實踐的一部分。
謝謝。也感謝@eryksun。我已經知道了。 – Searene