ctypes加载一个没有错误消息的DLL,但没有任何反应

时间:2013-09-01 00:38:54

标签: c++ python dll ctypes

我尝试在ctypes中使用windll.LoadLibrary将dll文件导入python。虽然没有任何错误消息,但是头文件中列出的所有函数似乎都没有成功加载。我想知道dll文件是否有任何问题,或者我错误地使用了windll.LoadLibrary方法。

可以从以下链接下载dll和头文件: http://www.cc.ncu.edu.tw/~auda/ATC3DG.rar

我使用的python命令是:

from ctypes import * 
libc=windll.LoadLibrary('ATC3DG.DLL')

可以从以下链接查看结果,显示dir(libc)没有给我ATC3DG.h中列出的任何函数或变量:

http://www.cc.ncu.edu.tw/~auda/ATC3DG.jpg

我在Windows 7(64位)平台上使用python 2.7.3(32位)和ipython 0.13.1。

谢谢,

张小姐

1 个答案:

答案 0 :(得分:0)

除非您已经访问过该功能,否则在使用dir时它们不会显示。例如:

In [98]: from ctypes import cdll

In [99]: libc = cdll.LoadLibrary('libc.so.6')

In [100]: dir(libc)
Out[100]:
['_FuncPtr',
 '__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_func_flags_',
 '_func_restype_',
 '_handle',
 '_name']

In [101]: libc.printf
Out[101]: <_FuncPtr object at 0x65a12c0>

In [102]: dir(libc)
Out[102]:
['_FuncPtr',
 '__class__',
 '__delattr__',
 '__dict__',
 '__doc__',
 '__format__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__hash__',
 '__init__',
 '__module__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_func_flags_',
 '_func_restype_',
 '_handle',
 '_name',
 'printf']

您可以通过查看CDLL.__getitem__CDLL.__getattr__方法了解原因:

class CDLL(object):
    # ...

    def __getattr__(self, name):
        if name.startswith('__') and name.endswith('__'):
            raise AttributeError(name)
        func = self.__getitem__(name)
        setattr(self, name, func)
        return func

    def __getitem__(self, name_or_ordinal):
        func = self._FuncPtr((name_or_ordinal, self))
        if not isinstance(name_or_ordinal, (int, long)):
            func.__name__ = name_or_ordinal
        return func