views:

916

answers:

1

I have a DLL containing a C function with a prototype like this:

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

I want to call it from Python using ctypes. The function expects a pointer to a chunk of memory, into which it will write the results. I don't know how to construct and pass such a chunk of memory. The ctypes documentation isn't much help.

Constructing an array and passing it "byref", like this:

    cresult = (c_ulong * num)()
    err = self.c_read_block(addr, byref(cresult), num)

Gives this error message:

ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of pointer to c_ulong_Array_2

I guess that is because the Python ulong array is nothing like a c uint32 array. Should I use create_char_string. If so, how do I persuade Python to "cast" that buffer to an LP_c_ulong?

+6  A: 

You can cast with the cast function :)

>>> 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>
>>>
Mark Rushakoff
Very excellent. Thanks. Is there some documentation that you gleaned this knowledge from?
Andrew Bainbridge
I've used `ctypes` a few times and I've encountered it in the linked documentation before.
Mark Rushakoff
Thanks! That got me up and running, too.
David Poole
Thank you. I, too, found it useful.
Frederick