python使用ctypes调用dll遇到的坑解决记录
作者:小纵横 Go学习日记
这篇文章主要为大家介绍了python使用ctypes调用dll遇到的坑解决记录,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
使用ctypes调用dll遇到的坑
dll调用
from ctypes import * dll = windll.LoadLibrary('MyDLL.ll') # 方式1 dll = WinDLL('MyDLL.ll') # 方式2 dll = CDLL('MyDLL.dll') # 方式3 dll = cdll.LoadLibrary('MyDLL.dll') # 方式4 # 以上4中调用方式差不多
问题分析
报错OSError: [WinError 126] 找不到指定的模块
2个原因:
1. dll的路径写错了,
2. 缺少相关依赖库
我本机装的 vs2017,但是我拿到的dll是vs2012编译的,会有问题,我用vs2017重新编译后就解决了这个问题.
还有可能遇到dll无效的问题,这个是版本的原因,64位的python对应64位的dll,32位对应32位即可.
dll内方法的调用
出现 access violation reading 0x0000000025F0FA60这种异常,出现在函数需要传递指针的时候,解决办法需要指定argtypes.
dll.CreateProcess.restype = c_void_p # 对应c的void* theEnv = dll.CreateProcess() # 指定参数类型 dll.Initialization.argtypes = [c_void_p,c_char_p,c_char_p,c_char_p] p1 = c_char_p("xxx1.txt".encode('utf-8')) p2 = c_char_p("xxx2.txt".encode('utf-8')) p3 = c_char_p("xxx3.txt".encode('utf-8')) ret = c_int(0) # 此处传递过来的参数也需要是对应的类型的参数 ret = dll.Initialization(theEnv, p1, p2 ,p3) # ctypes里没有c_int的指针类型,这里需要用POINTER自己定义一下 c_int_p = POINTER(c_int*100) faultID = c_int_p() dll.GetFaultList.argtypes = [c_void_p,c_int_p] dll.GetFaultList.restype = c_int # 这里faultID传参时不要忘了用类型包装,否则就会出现access violation异常 rtn = dll.GetFaultList(theEnv, c_int_p(faultID))
以上就是python使用ctypes调用dll遇到的坑解决记录的详细内容,更多关于python ctypes调用dll坑的资料请关注脚本之家其它相关文章!