ctypes, function pointers and a lot of trouble
Nick Craig-Wood
nick at craig-wood.com
Mon Jun 2 12:30:22 EDT 2008
Matt <mr.edel at gmx.at> wrote:
> class MemStreamData(Structure):
> _fields_ = [("mode", c_byte),
> ("lPos", c_uint),
> ("dwVisibleSize", c_uint),
> ("dwBufferSize", c_uint),
> ("cpBuffer", POINTER(c_char))]
>
> class FilStreamData (Structure):
> _fields_ = [("szFileName", c_char * 30),
> ("hFile", c_uint)]
>
>
>
> and the code to fill all that with the right data is the following:
>
>
> datainfo = cdReleaseImageInfo()
>
> databuf = c_char * 100000
> cbuffer=MemStreamData()
> cbuffer.mode = c_byte(0)
> cbuffer.lPos = c_uint(0)
> cbuffer.dwVisibleSize = c_uint(100000)
> cbuffer.dwBufferSize = c_uint(100000)
>
> #this line does not work, wrong datatype!?
> cbuffer.cpBuffer = POINTER(databuf)
[snip]
> Does anyone see where the errors are?
databuf = c_char * 100000
Is a type not an instance...
You need to instantiate it, eg
>>> from ctypes import *
>>> class MemStreamData(Structure):
... _fields_ = [("cpBuffer", POINTER(c_char))]
...
>>> cbuffer=MemStreamData()
>>> databuf = c_char * 100000
>>> cbuffer.cpBuffer = POINTER(databuf)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: expected LP_c_char instance, got _ctypes.PointerType
>>> databuftype = c_char * 100000
>>> databuf = databuftype()
>>> cbuffer.cpBuffer = databuf
>>> databuf
<__main__.c_char_Array_100000 object at 0xb7d04dac>
There is a shorthand for exactly this though as it is a common operation
>>> databuf = create_string_buffer(1000)
>>> cbuffer.cpBuffer = databuf
>>> databuf
<ctypes.c_char_Array_1000 object at 0xb7d129bc>
--
Nick Craig-Wood <nick at craig-wood.com> -- http://www.craig-wood.com/nick
More information about the Python-list
mailing list