On May 31, 2:52 pm, Thomas Heller <[EMAIL PROTECTED]> wrote: > Eric schrieb: > > > > > Hi, > > > I am currently dealing with ctypes, interfacing with winscard libbrary > > (for smart card access). > > > Several APIs (e.g. SCardListReaderGroupsW ) take a pointer to an > > unicode string as a parameter , which points at function return to a > > "sequence" of unicode strings, NULL terminated. The last string is > > double NULL terminated. (of course buffer length is also returned as > > another parameter). > > > e.g. it could return something like > > 'group1\x00group2\x00group3\x00\x00' > > > What should I use as argtypes to my function prototype in order to > > gain access to the full list? using c_wchar_p works, but it resolves > > the string until it reaches the first \x00, resulting in having access > > to the first entry of the list only. > > A c_wchar_p instance represent a (one!) zero-terminated string, as you > already know. A POINTER(c_wchar) instance is more flexible, you should > use that instead. It can be indexed/sliced with arbitrary indexes. > > Here is a simple script to get you started: > > """ > from ctypes import * > > # Normally, the function call will fill the buffer: > buf = create_unicode_buffer("first\0second\0third\0") > > # The pointer you will pass to the function call > ptr = cast(buf, POINTER(c_wchar)) > > # function call omitted > > # Print the raw result > print ptr[:len(buf)] > > # Print a list of strings > print ptr[:len(buf)].split("\0") > """ > > Thomas
Thanks Thomas, it works as expected! Regards, Eric -- http://mail.python.org/mailman/listinfo/python-list