E
Eric
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.
as reference, my current ctypes mapping for this API is:
# extern WINSCARDAPI LONG WINAPI
# SCardListReaderGroupsW(
# IN SCARDCONTEXT hContext,
# OUT LPWSTR mszGroups,
# IN OUT LPDWORD pcchGroups);
_ListReaderGroups = scardlib.SCardListReaderGroupsW
_ListReaderGroups.argtypes = [ c_ulong, c_void_p, c_void_p ]
_ListReaderGroups.restype = c_ulong
Calling the API looks like:
pcchreadergrp = c_long(SCARD_AUTOALLOCATE)
groups = c_wchar_p()
_ListReaderGroups( ctx, byref(groups), byref(pcchreadergrp))
Should I be using some array/ctypes.cast() combination to gain access
to all returned characters?
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.
as reference, my current ctypes mapping for this API is:
# extern WINSCARDAPI LONG WINAPI
# SCardListReaderGroupsW(
# IN SCARDCONTEXT hContext,
# OUT LPWSTR mszGroups,
# IN OUT LPDWORD pcchGroups);
_ListReaderGroups = scardlib.SCardListReaderGroupsW
_ListReaderGroups.argtypes = [ c_ulong, c_void_p, c_void_p ]
_ListReaderGroups.restype = c_ulong
Calling the API looks like:
pcchreadergrp = c_long(SCARD_AUTOALLOCATE)
groups = c_wchar_p()
_ListReaderGroups( ctx, byref(groups), byref(pcchreadergrp))
Should I be using some array/ctypes.cast() combination to gain access
to all returned characters?