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