Должны ли структуры в python заполняться нулями перед использованием в вызовах WinAPI? - PullRequest
0 голосов
/ 17 ноября 2011

Я хочу использовать WinAPI (CreateProcessA) в python с помощью ctypes.

Для правильного вызова функции я должен заранее создать некоторую структуру (например, STARTUPINFO, PROCESSINFORMATION).

Я знаю, что если вы хотите использовать структуру в WinAPI, вы должны использовать ZeroMemory, чтобы заполнить структуру нулями.

Должен ли я сделать то же самое в Python?

Книга, которую я читаю, не дает ответа на этот вопрос.

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Это зависит. Я не думаю, что есть какое-то одно общее требование. Давайте рассмотрим два приведенных вами примера в контексте CreateProcess.

lpStartupInfo

Этот параметр помечен аннотацией __in. Это означает, что информация передается от вызывающей стороны к CreateProcess. В этом случае вызывающая сторона несет ответственность за обеспечение надлежащей инициализации всех полей. Простой и распространенный способ сделать это - инициализировать всю структуру на ноль, а затем изменить только те поля, которые вы хотите отличать от нуля.

lpProcessInformation

Этот параметр помечен аннотацией __out. Это означает, что информация передается из CreateProcess вызывающей стороне. Любая инициализация, которую вы выполняете перед вызовом, игнорируется. Контракт заключается в том, что CreateProcess не будет читать содержимое передаваемой вами структуры, но будет полностью инициализировать эту структуру. В таких случаях я считаю, что бессмысленно инициализировать структуру до ее передачи в CreateProcess.

.

Конечно, если CreateProcess завершится неудачей, возвращаемые значения не определены, и вы не должны их читать. Но даже если вы инициализировали нулевую структуру информации о процессе перед вызовом, у вас нет гарантии, что CreateProcess не будет частично записана в нее. В случае сбоя функции API вы просто не должны читать что-либо, возвращенное ею, если в документации не указано иное.

Резюме

В заключение я бы посоветовал вам инициализировать все входные значения, передаваемые функции, а не инициализировать выходные значения.

0 голосов
/ 17 ноября 2011

Да. Практика заполнения структур нулями является частью широко распространенной практики подготовки данных.

...