Ответ 1
Вы можете использовать функцию cast
:)
>>> import ctypes
>>> x = (ctypes.c_ulong*5)()
>>> x
<__main__.c_ulong_Array_5 object at 0x00C2DB20>
>>> ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong))
<__main__.LP_c_ulong object at 0x0119FD00>
>>>
У меня есть DLL, содержащая C-функцию с таким прототипом:
int c_read_block(uint32 addr, uint32 *buf, uint32 num);
Я хочу вызвать его из Python с помощью ctypes. Функция ожидает указатель на кусок памяти, в который будет записываться результат. Я не знаю, как построить и передать такой кусок памяти. Документация ctypes не очень помогает.
Построение массива и передача его "byref", например:
cresult = (c_ulong * num)() err = self.c_read_block(addr, byref(cresult), num)
Дает следующее сообщение об ошибке:
ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of pointer to c_ulong_Array_2
Я предполагаю, что это потому, что улоновый массив Python не похож на массив c uint32. Должен ли я использовать create_char_string
. Если да, то как я могу убедить Python "бросить" этот буфер в LP_c_ulong?
Вы можете использовать функцию cast
:)
>>> import ctypes
>>> x = (ctypes.c_ulong*5)()
>>> x
<__main__.c_ulong_Array_5 object at 0x00C2DB20>
>>> ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong))
<__main__.LP_c_ulong object at 0x0119FD00>
>>>
В решении есть опечатка. Чтобы получить указатель на массив улонг, вам нужно отбросить до POINTER(list of ulong)
In [33]: ptr = ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong*5))
In [34]: ptr
Out[34]: <__main__.LP_c_ulong_Array_5 at 0x23e2560>