Python 3.11用ctypes调用Windows DLL触发访问违例异常求助
问题排查与解决
核心问题:调用约定不匹配
DLL导出函数标注的CALLBACK在Windows平台下等价于__stdcall调用约定,但你使用了ctypes.CDLL加载库——CDLL默认采用cdecl调用约定,这会导致函数调用时的栈处理逻辑不匹配,直接引发内存访问错误(即你遇到的access violation)。
修复步骤
替换库加载方式
将instance = CDLL(shared_lib_path)改为instance = WinDLL(shared_lib_path),WinDLL是ctypes专门用于加载采用stdcall调用约定的Windows DLL的类。修正调用顺序
你的代码中先调用Ixud_DriverClose再调用Ixud_DriverInit,逻辑完全颠倒。正常流程应该是先初始化驱动,再在使用完毕后关闭。虽然这可能不是本次崩溃的直接原因,但会导致后续逻辑异常,需要调整顺序。参数与返回值类型验证
你已经正确设置了argtypes和restype为WORD,byref(found)也正确传递了WORD类型的指针,符合函数要求的WORD*参数,这部分无需修改。
修正后的完整代码示例
from ctypes import * from ctypes.wintypes import WORD import platform bits, system = platform.architecture() shared_lib_path = "" if system.startswith('Windows'): if bits.startswith('64'): shared_lib_path = "./DLL/x64/my.dll" else: shared_lib_path = "./DLL/x86/my.dll" else: # 其他系统处理逻辑 pass # 用WinDLL加载stdcall约定的DLL instance = WinDLL(shared_lib_path) # 初始化驱动 found = WORD(0) init = instance.Ixud_DriverInit init.argtypes = [POINTER(WORD)] init.restype = WORD retcode = init(byref(found)) # 后续逻辑:如果初始化成功,使用设备... if retcode == 0: print(f"检测到{found.value}台设备") # 关闭驱动 close = instance.Ixud_DriverClose close.restype = WORD ret = close()
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

