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

she*_*per 4 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)
Run Code Online (Sandbox Code Playgroud)

但是,我在python 64位,我的DLL也编译为x64,我从上面的最后一行得到一个错误说:

argument 1: <class 'OverflowError'>: int too long to convert
Run Code Online (Sandbox Code Playgroud)

我检查句柄是'8791681138688'的长int(int64),那么这是否意味着windll.kernel32只处理int32句柄?谷歌搜索显示kernal32也适用于64位窗口.我应该怎么处理呢?

Ery*_*Sun 7

FreeLibrary采用句柄,定义为C void *指针.请参阅Windows数据类型.在函数指针中设置argtypes:

import ctypes
from ctypes import wintypes

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)    
kernel32.FreeLibrary.argtypes = [wintypes.HMODULE]
Run Code Online (Sandbox Code Playgroud)

一个Python的预设转换intlong(改名int在Python 3)是一个C long,其随后转换为一个C int.微软long在64位Windows上使用32位,这就是转换提升的原因OverflowError.

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