2015-12-02 536 views
2

我在Windows 7 64位上运行Python 2.7 32位(Anaconda)。Ctypes:无法导入windll

我想用ctypes的做Win32 API调用,我有一个很奇怪的问题:我能import ctypes,但不是import ctypes.windll,我得到以下错误:

ImportError: No module named windll 

我已检索网页所以我没有发现类似于我的问题的东西(它可能是关于不可能导入ctypes,或者是您尝试导入的DLL中的错误)。

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

回答

2

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

import ctypes 
print dir(ctypes) 

什么也很有趣的是,IPython的自动完成功能被误导在这里,因为它没有import ctypes.后显示windll作为一种可能的选择,当TAB-自动填充。

+1

记住,使用'ctypes.windll'让你在任何模块出现这种情况的一个函数加载同一个DLL,并设置原型('restype','argtypes','errcheck')怜悯你也在呼唤。函数指针实例缓存在'windll'缓存的'WinDLL'实例上,因此与其他用户定义的类型和errcheck函数相比,您可能会发生冲突。从长远来看,最好是调用'ctypes.WinDLL'来获取特定于您的模块或脚本的实例。 – eryksun

+0

@eryksun非常感谢您的提示! – gaborous

+0

为了反弹eryksun的评论:你不能直接调用'ctypes.WinDLL.kernel32',你需要做以下事情:'from ctypes import LibraryLoader; windll = LibraryLoader(ctypes.WinDLL)',那么你可以调用'windll.kernel32',而不需要提到eryksun提到的重定义问题。 – gaborous