问题描述
python对C++写的dll进行调用时,遇到输入参数为char *类型,经常报错,或者就是没有报错也根本调用不了库里函数,问题的实质就是类型错误。Python中没有char这种数据,需要将string类型转换。我尝试了一下两种方法,都可以调用成功,分享出来。
解决方式
首先将dll部分,C++中的char *类在python中用c_char_p类型或者ctypes.POINTER(ctypes.c_char)表示都可以
C++中函数
int acsc_OpenCommEthernetTCP(char* Address, int Port)
import ctypes
dllFile = "ACSCL_x86.dll"
re_io = ctypes.windll.LoadLibrary(dllFile)
openTCP = re_io.acsc_OpenCommEthernetTCP
openTCP.argtype = [ctypes.c_char_p, ctypes.c_int16]
openTCP.restype = ctypes.c_int16
openTCP1 = re_io.acsc_OpenCommEthernetTCP
openTCP1.argtype = [ctypes.POINTER(ctypes.c_char), ctypes.c_int16]
openTCP1.restype = ctypes.c_int16
bytes方式
改变成bytes,传递给函数。
TCPbyte = bytes("10.0.0.100","gbk")
openTCP(TCPbyte, 701)
数组方式
先变成bytes再转数组再变成字符指针
TCPchar = (ctypes.c_char * 100)(*bytes("10.0.0.100","utf-8"))
ctypes.cast(TCPchar, ctypes.POINTER(ctypes.c_char))
openTCP1(TCPchar, 701)
注意凡是string类都需要转换下再输入参数到C++的函数中。