使用Python ctypes调用DLL函数时遇TypeError问题求助
解决ctypes调用DLL的类型错误问题
问题根源
你代码里的h_nw = ct.POINTER(ct.c_int32)只是声明了指针类型,而非创建一个指向c_int32变量的实际指针实例。DLL的load_active函数需要的是能接收输出值的INT32*(即指向整数的指针),但你传递的是类型本身,导致类型不匹配错误。
修正方案
需要先创建一个c_int32类型的变量,再通过ctypes.byref()获取它的指针(作为输出参数传递给DLL函数),具体代码如下:
import ctypes as ct # 假设_validate_result已按业务逻辑定义,用于校验函数返回状态 def _validate_result(result, func, args): if result != 0: # 可根据DLL实际错误码规则调整判断逻辑 raise RuntimeError(f"load_active调用失败,状态码: {result}") return result dll = ct.CDLL('example.dll') dll.load_active.argtypes = [ct.POINTER(ct.c_int32), ct.c_int32] dll.load_active.errcheck = _validate_result # 1. 创建c_int32变量,用于接收DLL输出的句柄值 h_nw = ct.c_int32(0) flags = ct.c_int32(0) # 2. 用byref传递变量的指针,匹配DLL函数要求的INT32*类型 status = dll.load_active(ct.byref(h_nw), flags) # 调用完成后,通过h_nw.value获取返回的句柄 print(f"返回的网络句柄: {h_nw.value}")
关键说明
ct.c_int32(0):创建实际的32位整数变量,初始值设为0,DLL会将输出的句柄值写入该变量。ct.byref(h_nw):生成指向该变量的指针,等价于C语言中的&h_nw,完全符合DLL函数对INT32*参数的要求。- 若需更明确的指针类型,也可使用
ct.pointer(h_nw),但byref更轻量,适合作为函数参数传递。
内容的提问来源于stack exchange,提问作者oakca
相关产品推荐
相关产品推荐

