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

本文记录了使用Python的ctypes模块调用DLL时遇到的二级指针参数问题。针对C函数int sd_EnumDevice(char** szDevNames, ULONG *pulLen),解释了char**参数的意义,并提供了创建可变字符串缓冲区和使用byref()处理参数的方法,以解决调用过程中遇到的挑战。" 73251396,5641293,Dragonboard 410c: 确定Kernel defconfig与DTS配置,"['dragonboard-410c', '96Boards', 'kernel配置', '设备树', 'Android开发']

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

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

上图是 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

### Python 中通过 `ctypes` 调用 C 动态库并传递 `unsigned char **` 当需要在 Python C/C++ 编写的动态库之间交互时,特别是涉及到复杂类型的参数如双指针 (`unsigned char **`) ,可以利用 `ctypes` 库来完成这一操作。对于 `unsigned char **` 类型,在 Python 中可以通过创建指向字符数组的指针对象来进行处理。 #### 创建 C 函数接口 假设有一个简单的 C 函数接受 `unsigned char **` 参数作为输入,并对其进行某些操作: ```c // example.c #include <stdio.h> void process_strings(unsigned char **strings, int count) { for (int i = 0; i < count; ++i) { printf("%s\n", strings[i]); } } ``` 编译此文件为共享库(Linux 下 `.so`, Windows 下 `.dll`),以便可以在 Python 中加载它[^2]。 #### 使用 `ctypes` 加载调用函数 下面是在 Python 中如何设置以及调用上述 C 函数的例子: ```python import ctypes as ct # 假设已经生成了一个名为 'example.dll' 或者 'libexample.so' 的动态链接库 library_name = "path/to/your/library" if library_name.endswith('.dll'): dll = ct.CDLL(library_name) else: dll = ct.CDLL(library_name) def call_c_function_with_double_pointer(): # 定义要传递给C函数的数据列表 string_list = ["hello".encode(), "world!".encode()] # 将字符串转换成适合传递的形式:先转为字节数组再构建指针数组 byte_arrays = [ct.create_string_buffer(s) for s in string_list] ptr_array_type = ct.POINTER(ct.c_char_p) * len(byte_arrays) ptr_array = ptr_array_type(*(map(ct.addressof, byte_arrays))) # 设置预期接收的参数类型 dll.process_strings.argtypes = [ptr_array_type._type_, ct.c_int] # 实际调用C函数 dll.process_strings(ptr_array, len(string_list)) call_c_function_with_double_pointer() ``` 这段代码展示了怎样准备数据结构以匹配目标 C API 所需格式,并正确设置了 `argtypes` 属性指定期望接收到的具体参数类型[^1]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值