Python ctypes中的指针和数组

And*_*dge 37 python arrays ctypes pointers

我有一个包含C函数的DLL,其原型如下:

int c_read_block(uint32 addr, uint32 *buf, uint32 num);

我想用ctypes从Python中调用它.该函数需要一个指向一块内存的指针,它将写入结果.我不知道如何构造和传递这么一块内存.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 ulong数组与ac uint32数组完全不同.我应该用吗create_char_string?如果是这样,我如何说服Python将该缓冲区"转换"为LP_c_ulong?

Mar*_*off 55

你可以使用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>
>>> 
Run Code Online (Sandbox Code Playgroud)