python 学习记录二: 用python调用dll 遇到 char** 参数

想要用python 调用dll 必须应用ctypes module

如果你用的32位python 调用 dll 请使用 CDLL方法, 64位的请使用WINDLL方法

python 学习记录二: 用python调用dll 遇到 char** 参数_第1张图片

上图是 c, ctypes, python 数据类型对照, 基本数据类型ctypes 都有了.

dll中一个函数是int sd_EnumDevice(char** szDevNames, ULONG *pulLenchar** szDevNames 这个参数为2级指针,对于没有c基础的同学很难理解(我也不太理解这里的参数为什么要用这种类型),简单点说就是指向指针的指针.这个地方我也查了很多资料但是网上的资料真的不多.最后终于找到一段代码

string_buffers = [create_string_buffer(64) for i in range(1)]

pointers = (c_char_p*4)(*map(addressof, string_buffers))

这里还要顺带说一下python 默认的 string 值是不可变的, 不能传递 string 到一个 C 函数去改变它的内容,所以需要使用 create_string_buffer 创建一个可变的 string_buffer

对于其他需要C函数修改传入参数的类型可以用ctypes 提供关键字 byref() 处理

最终我调用上面C函数的参数是这样的

string_buffers = [create_string_buffer(64) for i in range(1)]

pointers = (c_char_p*4)(*map(addressof, string_buffers))

num = 0

u = c_ulong(num)

iRet = -1

try:

iRet = self.dll.sd_EnumDevice(pointers, byref(u))

except Exception as e:

print('异常', str(e))

 

你可能感兴趣的:(pyqt,python)