python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python ctypes调用dll坑

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坑的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文