使用ctypes windll卸载64位dll时出错

时间:2014-05-07 15:29:37

标签: python 64-bit ctypes

我发现这里有几篇关于使用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位窗口。我应该怎么处理呢?

1 个答案:

答案 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 intlong(在Python 3中重命名为int)的默认转换是C long,后来转换为C {{ 1}}。即使在64位Windows上,Microsoft也使用32位int,这就是转换引发long的原因。

在具有64位OverflowError的平台上(即几乎每隔一个64位操作系统),将指针作为Python整数传递而不定义函数long实际上可能分段过程。初始转换为argtypes的工作正常,因为它与指针的大小相同。但是,随后转换为32位C long可能会默默地截断该值。