Python 使用ctypes Windell卸载64位dll时出错

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:

我发现这里有几篇关于使用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: <class 'OverflowError'>: int too long to convert
参数1::int太长,无法转换
我将句柄检查为'8791681138688'的长int(int64),那么这是否意味着windell.kernel32只处理int32句柄?谷歌搜索显示内核32也适用于64位windows。那么我应该如何处理这个问题呢?

接受一个句柄,定义为C
void*
指针。提到在函数指针的
argtypes
中设置此参数:

import ctypes
from ctypes import wintypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)    
kernel32.FreeLibrary.argtypes = [wintypes.HMODULE]
Python
int
long
(在Python 3中重命名为
int
)的默认转换为C
long
,随后转换为C
int
。即使在64位Windows上,Microsoft也使用32位
,这就是转换引发
溢出错误的原因


在具有64位
的平台上(即几乎每隔64位操作系统),在不定义函数的
argtypes
的情况下,将指针作为Python整数传递实际上可能会导致进程中断。到
long
的初始转换工作正常,因为它与指针大小相同。但是,随后强制转换为32位C
int
可能会自动截断该值。

然后
kernel32.freellibrary(handle)
,而不是
windell.kernel32.freellibrary(handle)
,对吗?@endolith,是的,这定义了缓存在
kernel32
上的
freellibrary
函数指针上的原型。最好避免使用
windell
加载器,因为它是全局的,可能会导致通用共享库(如kernel32.dll)的包之间发生冲突。