with ctypes, how to parse a multi-string
Thomas Heller
theller at ctypes.org
Thu May 31 08:52:15 EDT 2007
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
More information about the Python-list
mailing list