Как найти функции DLL из Python? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь получить доступ к DLL из Python с помощью Ctypes. но он не мог найти функции! простой код выглядит примерно так:

from ctypes import cdll
dll=cdll.LoadLibrary("SDK.dll")
SdkService=dll.SDK.Service()

и ошибка трассировки:

Traceback (most recent call last):
  File "d:\Fold1\project\test.py", line 3, in <module>
    SdkService=dll.SDK.Service()
  File "C:\Users\Saeed\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 361, in __getattr__
    func = self.__getitem__(name)
  File "C:\Users\Saeed\AppData\Local\Programs\Python\Python36\lib\ctypes\__init__.py", line 366, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'SDK' not found

Теперь, как я могу найти функции из Python? или любой другой план доступа к функциям?

1 Ответ

0 голосов
/ 14 октября 2019

Вы уже загрузили SDK dll, дополнительный атрибут не требуется.

Имена, экспортируемые из SDK.dll, являются атрибутами объекта, возвращенного из ctypes.cdll.LoadLibrary() (экземпляр CDLL класса ), который вы присвоили имени dll.

Поэтому, если SDK.dll экспортирует функцию с именем Service, вы можете вызвать ее с помощью:

dll.Service()

См. Доступ к функциям из загруженных библиотек раздел документации ctypes.

Учтите, что ctypes.cdll ожидает, что библиотеки DLL будут использовать объявлений экспорта функций C . Пространства имен C ++ не экспортируются.

Вы также можете иметь дело с библиотекой DLL, которая использует соглашения stdcall только для Windows, и в этот момент вам нужно использовать ctypes.windll (предполагается, что функции возвращают int по умолчанию) или ctypes.oledll (предполагает HRESULT возвращаемые значения) библиотечные загрузчики. Нет простого способа определить из одной только DLL , какое соглашение о вызовах оно ожидает. Если у вас есть соответствующие заголовочные файлы .h (я ожидаю, что SDK будет иметь их), то посмотрите, используют ли определенные функции __cdecl или __stdcall. В противном случае, просто попробуйте использовать DLL с cdll, и если вы получите ValueError: Procedure called with not enough arguments (<n> bytes missing) or wrong calling convention, используйте вместо нее cdll.windll.

...