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 -- http://mail.python.org/mailman/listinfo/python-list