ctypes卸载dll

Posted

技术标签:

【中文标题】ctypes卸载dll【英文标题】:ctypes unload dll 【发布时间】:2012-10-19 04:51:22 【问题描述】:

我正在用这样的 ctypes 加载一个 dll:

lib = cdll.LoadLibrary("someDll.dll");

库完成后,我需要卸载它以释放它使用的资源。我在文档中查找有关如何执行此操作的任何内容时遇到问题。我看到这个相当老的帖子:How can I unload a DLL using ctypes in Python?。我希望有一些我没有发现的明显的东西,而不是黑客攻击。

【问题讨论】:

我有,但是,从我引用的帖子中:“我不知道,但我怀疑这会卸载 dll。我猜它只会从当前名称中删除绑定命名空间(根据语言参考)“我怀疑这是真的。我相当确定我需要释放的资源仍然是开放的。 【参考方案1】:

我发现的唯一真正有效的方法是打电话给LoadLibraryFreeLibrary。像这样:

import ctypes

# get the module handle and create a ctypes library object
libHandle = ctypes.windll.kernel32.LoadLibraryA('mydll.dll')
lib = ctypes.WinDLL(None, handle=libHandle)

# do stuff with lib in the usual way
lib.Foo(42, 666)

# clean up by removing reference to the ctypes library object
del lib

# unload the DLL
ctypes.windll.kernel32.FreeLibrary(libHandle)

更新:

从 Python 3.8 开始,ctypes.WinDLL() 不再接受 None 来指示没有传递文件名。相反,您可以通过传递一个空字符串来解决此问题。

见https://bugs.python.org/issue39243

【讨论】:

当我尝试调用函数时,当我沿着这条路线走下去时,我的 ctypes 调用开始失败并出现以下错误:“ValueError:过程可能调用了太多参数(超过 16 个字节)”跨度> 您的函数打算使用什么调用约定? WinDLL 表示 stdcall。你的库是cdecl 吗?如果是这样,请改用ctypes.CDLL 感谢您的解释。

以上是关于ctypes卸载dll的主要内容,如果未能解决你的问题,请参考以下文章

php中的扩展解析

python 在windows下监听键盘按键

ctypes.pointer、ctypes.POINTER 和 ctypes.byref 有啥区别?

Python ctypes:如何将 ctypes 数组传递给 DLL?

ctypes 模块

ctypes:从任意整数构造指针