我发现这里有几篇关于使用ctypes卸载dll的帖子,我完全按照说法工作的方式 来自ctypes import *
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
我检查句柄是&#39; 8791681138688&#39;的长整数(int64),那么这是否意味着windll.kernel32只处理int32句柄?谷歌搜索显示kernal32也适用于64位窗口。我应该怎么处理呢?
答案 0 :(得分:7)
FreeLibrary
接受一个句柄,定义为C void *
指针。请参阅Windows Data Types。在函数指针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 {{ 1}}。即使在64位Windows上,Microsoft也使用32位int
,这就是转换引发long
的原因。
在具有64位OverflowError
的平台上(即几乎每隔一个64位操作系统),将指针作为Python整数传递而不定义函数long
实际上可能分段过程。初始转换为argtypes
的工作正常,因为它与指针的大小相同。但是,随后转换为32位C long
可能会默默地截断该值。