如何用ctypes调用DLL返回的Bridge类实例方法?代码报错求助
解决ctypes调用Bridge类实例方法的问题
嘿,我来帮你搞定这个ctypes调用DLL的问题!你遇到的TypeError: must be a ctypes type错误,核心原因是你把c_double的实例传给了POINTER(),但POINTER()要求传入的是ctypes类型(比如c_int、自定义结构体类型这类),不是具体的变量实例,这才导致了报错。
接下来给你正确的实现步骤:
1. 先声明Bridge类型占位
因为ctypes不知道你的DLL里Bridge类的内部结构,我们需要先定义一个对应的ctypes结构体类型(如果不需要直接访问类的成员变量,空结构体占位就行):
from ctypes import cdll, POINTER, Structure, c_void_p # 定义Bridge的占位结构体(若后续需要访问成员,可在_fields_里添加对应字段) class Bridge(Structure): _fields_ = []
2. 正确设置createBridge的返回类型
必须告诉ctypes,createBridge函数返回的是指向Bridge的指针,而不是默认的c_int类型:
bridge_dll = cdll.LoadLibrary("bridge.dll") # 明确指定createBridge的返回类型为Bridge指针 bridge_dll.createBridge.restype = POINTER(Bridge)
3. 获取指针并调用实例方法
现在调用createBridge就能拿到正确的指针了,调用方法时要注意给每个DLL方法设置参数和返回类型(否则ctypes会默认按int处理,容易出问题):
# 获取Bridge实例的指针 bridge_ptr = bridge_dll.createBridge() # 假设initialize是无参数、无返回值的方法,先设置它的函数原型 bridge_dll.initialize.argtypes = [POINTER(Bridge)] bridge_dll.initialize.restype = None # 调用方法,把Bridge指针传进去即可 bridge_dll.initialize(bridge_ptr)
补充小提示
- 如果
Bridge的其他方法有参数或返回值,一定要给对应的DLL函数设置argtypes和restype,比如有个返回整数的getResult方法:
bridge_dll.getResult.argtypes = [POINTER(Bridge)] bridge_dll.getResult.restype = c_int result = bridge_dll.getResult(bridge_ptr)
- 如果你的DLL是用C编写的,要注意C会对函数名做名字修饰,这时候要么让DLL导出时用
extern "C"避免修饰,要么需要找到修饰后的函数名来调用。
内容的提问来源于stack exchange,提问作者Elephant
相关产品推荐
相关产品推荐

