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