Ctypes:无法导入windll

gab*_*ous 5 python ctypes

我在 Windows 7 64 位上运行 Python 2.7 32 位(Anaconda)。

我想使用 ctypes 进行 win32 API 调用,但我有一个非常奇怪的问题:我可以import ctypes,但不能import ctypes.windll,我收到以下错误:

ImportError: No module named windll
Run Code Online (Sandbox Code Playgroud)

我已经爬行了网络,但是我没有找到任何与我的问题类似的内容(要么是根本无法导入ctypes,要么是您尝试导入的DLL中存在错误)。

有人知道我做错了什么吗?

gab*_*ous 6

看来你不能只是这样import ctypes.windll,你需要import ctypes然后使用ctypes.windll。我发现通过打印 ctypes 的所有属性:

import ctypes
print dir(ctypes)
Run Code Online (Sandbox Code Playgroud)

同样有趣的是,IPython 自动补全在这里具有误导性,因为windllimport ctypes..

  • 请记住,使用“ctypes.windll”会让您受到任何恰好加载相同 DLL 并在您也正在使用的函数上设置原型(“restype”、“argtypes”、“errcheck”)的模块的影响。打电话。函数指针实例缓存在“WinDLL”实例上,而“WinDLL”实例缓存在“windll”上,因此与其他用户定义的类型和“errcheck”函数相比,您定义类型和“errcheck”函数的方式可能会发生冲突。从长远来看,您最好调用“ctypes.WinDLL”来获取特定于您的模块或脚本的实例。 (3认同)
  • 您不调用“windll.kernel32”。您将获得一个函数指针实例作为属性,例如“windll.kernel32.CreateFileW”。使用加载器的另一个问题是它不允许您传递参数“use_last_error=True”,该参数与“ctypes.get_last_error()”和“ctypes.set_last_error()”一起使用。我建议您使用“kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)”。 (3认同)
  • 然后,当 MSDN 上记录的设置最后一个错误值的函数失败时,您可以使用“raise ctypes.WinError(ctypes.get_last_error())”获得格式良好的异常。 (2认同)