Python - 如何将LP_c_char_p转换为str或字节?

Jua*_* MC 5 c++ python json ctypes callback

这是我在stackoverflow中的第一个问题.我一直在寻找答案,但我找不到.

我试图获得一个应该包含字符串的回调.这个回调来自C++ DLL.与dll加载和回调相关的所有内容都有效,但是当解析回调内容时,它会崩溃.

调试我已经看到了如何调用我的回调实现,我可以在那里打印"Hello",但回调的返回对象无法序列化.这是错误:

TypeError: the JSON object must be str, bytes or bytearray, not 'LP_c_char_p'
Run Code Online (Sandbox Code Playgroud)

这是我加载DLL的方式.我正在使用cdll:

self.dxc_dll = cdll.DxC
Run Code Online (Sandbox Code Playgroud)

我的回调声明(使用ctypes)是这样的:

self.callback_type = CFUNCTYPE(c_char_p, POINTER(c_char_p))
self.callback = self.callback_type(self.callback_impl)
Run Code Online (Sandbox Code Playgroud)

方法callback_impl有这个签名:

def callback_impl(self, result):
    print("Callback works. Result: ", result)
    my_object = MyClass(result)
    ...
Run Code Online (Sandbox Code Playgroud)

这是MyClass init构造函数:

def __init__(self, json_string):
    self.__dict__ = json.loads(json_string)
Run Code Online (Sandbox Code Playgroud)

在我的C++库中,Callback签名以这种方式声明(它使用PInvoke和C#工作,我已经完成了,但在这种情况下不是这样):

CCallback::CCallback(char *(__stdcall  *func)(char *))
Run Code Online (Sandbox Code Playgroud)

所以我不知道它是否与json.loads行为有关,或者之前需要将LP_c_char_p转换为str或bytes.

  • 我正在使用Python附带的标准ctypes和json库.
  • 我在Windows 10 x64,Python 3.6.1 32位上使用PyCharm 2017,而dll库是使用Visual Studio 2013(也在Windows下)编译的32位版本

有什么我能做的吗?在此先感谢您的帮助.如果您了解更多信息以获得帮助,我将很乐意将其包含在内.问候.