0

我尝试在 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。

谢谢,

Erik Chang

4

1 回答 1

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
于 2013-09-01T00:48:16.070 回答