c_int python c++ json callback ctypes

c_int - Python: ¿cómo convertir un LP_c_char_p en str o bytes?



c_int() (0)

esta es mi primera pregunta en stackoverflow. He estado buscando la respuesta a esto, pero no lo encontré.

Estoy tratando de obtener una devolución de llamada que debe contener una cadena. Esta devolución de llamada proviene de un dll C ++. Todo está relacionado con la carga dll y el trabajo de devolución de llamada, pero cuando se trata de analizar el contenido de devolución de llamada se bloquea.

Depuración He visto cómo se llama a mi implementación de devolución de llamada y puedo imprimir un "Hola" allí, pero el objeto devuelto por la devolución de llamada no se puede serializar. Este es el error:

TypeError: the JSON object must be str, bytes or bytearray, not ''LP_c_char_p''

Así es como cargo el dll. Estoy usando cdll:

self.dxc_dll = cdll.DxC

Mi declaración de devolución de llamada (usando ctypes) es esta:

self.callback_type = CFUNCTYPE(c_char_p, POINTER(c_char_p)) self.callback = self.callback_type(self.callback_impl)

El método, callback_impl tiene esta firma:

def callback_impl(self, result): print("Callback works. Result: ", result) my_object = MyClass(result) ...

Y este es el constructor de MyClass init:

def __init__(self, json_string): self.__dict__ = json.loads(json_string)

En mi biblioteca C ++, la firma Callback se declara de esta manera (funciona usando PInvoke y C #, ya lo hice, pero no en este caso):

CCallback::CCallback(char *(__stdcall *func)(char *))

Así que no sé si podría estar relacionado con el comportamiento de json.loads o si es necesario convertir el LP_c_char_p a str o bytes anteriormente.

  • Estoy usando las bibliotecas estándar ctypes y json incluidas con Python.
  • Estoy usando PyCharm 2017 en Windows 10 x64, Python 3.6.1 32 bits y la biblioteca dll es una versión de 32 bits compilada con Visual Studio 2013 (también en Windows)

¿Hay algo que pueda hacer? Gracias de antemano por tu ayuda. Si conoce más información para ayudar, estaré encantado de incluirla. Saludos.