Я попытался использовать windll.LoadLibrary в ctypes для импорта файла 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
Я использую Python 2.7.3 (32-разрядная версия) и ipython 0.13.1 на платформе Windows 7 (64-разрядная версия).
Спасибо,
Эрик Чанг
Они не появляются, когда вы используете 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
Других решений пока нет …