问题描述

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++的函数中。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐