Copying void * string to
eryk sun
eryksun at gmail.com
Wed Feb 10 19:23:24 EST 2016
On Wed, Feb 10, 2016 at 6:07 AM, Martin Phillips
<martinphillips at ladybridge.com> wrote:
>
> Several functions in the C library return pointers to dynamically allocated w_char null
> terminated strings. I need to copy the string to a Python variable and call an existing
> library function that will free the dynamically allocate memory.
>
> My test code for this is
>
> def Test(fno, item):
> func = mylib. MyFunc
> func.restype = ct.c_void_p
> s = func(fno, item)
> result = s
> mylib.free(s)
> return result
>
> The problem is with the line that sets the result variable. I need this to make a copy of
> the dynamically allocated string, not the pointer to it.
There are several options, but I think the simplest is to use a
subclass of ctypes.c_wchar_p. subclasses of simple types don't get
converted automatically. Copy the string using the "value" attribute.
Then free() the pointer. But only copy and free the result if it isn't
NULL (i.e. a false boolean value).
import ctypes
mylib = ctypes.CDLL('path/to/mylib')
class MyLibError(Exception):
pass
class my_wchar_p(ctypes.c_wchar_p):
pass
mylib.MyFunc.restype = my_wchar_p
def test(fno, item):
s = mylib.MyFunc(fno, item)
if s:
result = s.value
mylib.free(s)
return result
raise MyLibError('mylib.MyFunc returned NULL')
More information about the Python-list
mailing list