Python 使用ctypes Windell卸载64位dll时出错
我发现这里有几篇关于使用ctypes卸载dll的帖子,我完全按照上面所说的方式工作 从ctypes导入*Python 使用ctypes Windell卸载64位dll时出错,python,64-bit,ctypes,Python,64 Bit,Ctypes,我发现这里有几篇关于使用ctypes卸载dll的帖子,我完全按照上面所说的方式工作 从ctypes导入* file = CDLL('file.dll') # do some stuff here handle = file._handle # obtain the DLL handle windll.kernel32.FreeLibrary(handle) 但是,我使用的是python 64位,我的dll也是为x64编译的,我从上面的最后一行得到一个错误,上面说: argument 1:
file = CDLL('file.dll')
# do some stuff here
handle = file._handle # obtain the DLL handle
windll.kernel32.FreeLibrary(handle)
但是,我使用的是python 64位,我的dll也是为x64编译的,我从上面的最后一行得到一个错误,上面说:
argument 1: <class 'OverflowError'>: int too long to convert
参数1::int太长,无法转换
我将句柄检查为'8791681138688'的长int(int64),那么这是否意味着windell.kernel32只处理int32句柄?谷歌搜索显示内核32也适用于64位windows。那么我应该如何处理这个问题呢?接受一个句柄,定义为Cvoid*
指针。提到在函数指针的argtypes
中设置此参数:
import ctypes
from ctypes import wintypes
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
kernel32.FreeLibrary.argtypes = [wintypes.HMODULE]
Pythonint
或long
(在Python 3中重命名为int
)的默认转换为Clong
,随后转换为Cint
。即使在64位Windows上,Microsoft也使用32位长
,这就是转换引发溢出错误的原因
在具有64位长
的平台上(即几乎每隔64位操作系统),在不定义函数的argtypes
的情况下,将指针作为Python整数传递实际上可能会导致进程中断。到long
的初始转换工作正常,因为它与指针大小相同。但是,随后强制转换为32位Cint
可能会自动截断该值。然后kernel32.freellibrary(handle)
,而不是windell.kernel32.freellibrary(handle)
,对吗?@endolith,是的,这定义了缓存在kernel32
上的freellibrary
函数指针上的原型。最好避免使用windell
加载器,因为它是全局的,可能会导致通用共享库(如kernel32.dll)的包之间发生冲突。