ctypes загружают dll без сообщения об ошибке, но ничего не произошло

Я попытался использовать 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-разрядная версия).

Спасибо,

Эрик Чанг

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector