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位窗口.我应该怎么处理呢?
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的预设转换int或long(改名int在Python 3)是一个C long,其随后转换为一个C int.微软long在64位Windows上使用32位,这就是转换提升的原因OverflowError.
在具有64位long(即几乎每隔一个64位操作系统)的平台上,将指针作为Python整数传递而不定义函数argtypes可能实际上是对该进程进行了段错误.初始转换long工作正常,因为它与指针的大小相同.但是,随后转换为32位C int可能会默默地截断该值.
| 归档时间: |
|
| 查看次数: |
2166 次 |
| 最近记录: |