【问题标题】:Unload DLL loaded in Python [duplicate]卸载在 Python 中加载的 DLL [重复]
【发布时间】:2015-12-20 08:50:38
【问题描述】:

在 Windows 上,我有一个我们自己制作的 DLL,其中加载了另一个 DLL。问题是当在 Matlab 中使用带有loadlibrarycalllibunloadlibrary 的 DLL 时,一切都很好。

在 Python 中,我尝试使用 ctypescffi,两者的结果相同。我可以加载 DLL 并调用函数,但我无法再次退出。 Python 挂起,我必须从任务管理器中结束任务。

ctypes我试着打电话

import _ctypes
_ctypes.FreeLibrary(lib._handle)

这里建议Free the opened ctypes library in Python 无效。此外,我尝试调用显式函数来卸载其他 DLL。

谁能给出提示或解决方案为什么它不会卸载/挂起?

【问题讨论】:

  • 链接的副本有两个错误的答案。对于接受的答案,请注意_ctypes 扩展模块定义了dlcloseFreeLibrary。当库不能再被释放时,这些函数会引发 OSError,因此没有理由使用 Piotr 的 isLoaded 函数。此外,他关于“ctypes 在内部保持对这个句柄的引用”的声明看起来只是编造的。实例_handle 仅用于repr。没有理由 del CDLL 实例(即最终确定它,假设一个引用)。

标签: python ctypes python-cffi


【解决方案1】:

我在这里找到了部分答案How can I unload a DLL using ctypes in Python?

显然必须直接拨打电话_ctypes.FreeLibrary

# Release DLL(?)
handle= lib._handle
 _ctypes.FreeLibrary(handle)

【讨论】:

  • 您在网站上找到了答案。这个问题应该被删除或关闭为重复,而不是发布相同的答案。
  • 无论del 正在解决什么问题,我向您保证它在卸载 DLL 方面什么也没做。在我的示例中,我没有做这样的事情,但显然 DLL_PROCESS_DETACH 代码运行了。请阅读CDLL 的源代码。 CDLL 实例的生命周期与释放库无关。 ctypes 从不 调用FreeLibrary。当 Piotr 说“ctypes 保持对这个句柄的内部引用”时,我不太确定他的意思,但明显的解释是错误的。
  • @eryksun 你说得对,我通过删除del 电话更正了我的答案。它什么也没做。
  • 它还挂着吗?您是否在while 循环中调用_ctypes.FreeLibrary 直到它引发OSError? DLL 保留每个进程的引用计数,该计数会随着进程中的每个LoadLibrary 调用而增加。加载器仅调用DLL_PROCESS_DETACH 并在引用计数减为0 时取消映射DLL,即如果DLL 被LoadLibrary 加载N 次,那么FreeLibrary 也必须被调用N 次。 (由于一个 DLL 可以映射到多个进程,这并不一定要从系统页表中卸载它,因此例如您可能仍然无法删除 DLL。)
  • 不,它不再挂了。我尝试多次调用_ctypes.FreeLibrary,并在第二次调用时抛出WindowsError: [Error 126] The specified module could not be found。它应该/会在 Windows 以外的其他平台上抛出OSError吗?不过我很高兴,它对我有用。很难找到,因为它没有真正记录在案。
猜你喜欢
  • 2011-01-27
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多