On Wed, Feb 10, 2016 at 6:07 AM, Martin Phillips <martinphill...@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') -- https://mail.python.org/mailman/listinfo/python-list