Вы используете Python 3, а строки (str
-типа) в Python 3 являются объектами Unicode. create_string_buffer
создает массивы C char
, поэтому вам необходимо передать объект bytes
. Если у вас есть объект str
, закодируйте его с помощью соответствующей кодировки, чтобы создать объект bytes
. Обратите внимание, что create_unicode_buffer
также создает массивы C wchar
и принимает объекты Python 3 str
.
Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> ctypes.create_unicode_buffer('abcd')
<ctypes.c_wchar_Array_5 object at 0x00C2D300>
>>> ctypes.create_string_buffer(b'abcd')
<ctypes.c_char_Array_5 object at 0x00C2D1C0>
>>> ctypes.create_string_buffer('abcd'.encode('utf-8'))
<ctypes.c_char_Array_5 object at 0x00C2D300>
Что касается второй части вашего вопроса, хотите ли вы отредактировать существующую строку или вернуть полностью новую строку, выделенную в куче? Если первое, использование create_string_buffer
для передачи изменяемой строки в функцию и ее изменения на месте будет работать. Вот простой пример вызова _strupr () из библиотеки Windows MSVCRT:
Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>> c = ctypes.CDLL('msvcr90.dll')
>>> strupr = c._strupr
>>> a=ctypes.create_string_buffer(b'abc')
>>> strupr.restype=ctypes.c_char_p
>>> strupr(a)
b'ABC'
Обратите внимание, что установка restype
(тип результата) функции на c_char_p
указывает ctypes преобразовывать возвращаемое значение в объект bytes
. Также обратите внимание, что _strupr
преобразует строку на месте, поэтому должен быть передан изменяемый строковый буфер. Передавать только байтовые строки Python в функции C, которые принимают const char*
, поскольку изменение строк Python напрямую через ctypes Bad TM .