Python передает определенный пользователем класс по ссылке на DLL - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время я работаю над проектом, который требует доступа к функциям в DLL, и я нашел ctypes для обработки вызова функции для меня.Однако я сталкиваюсь с некоторыми трудностями, когда некоторые функции запрашивают передачу параметров по ссылке.Я попробовал ctypes.by_ref (), но он не работает, потому что объект является классом, определенным пользователем.

А затем я попытался ctypes.pointer (), и он выплевывает сообщение об ошибке: " тип должен иметь информацию о хранилище".Я думаю, это означает, что он принимает только типы данных ctypes?

Мой код:

from ctypes import *
class myclass():
    a= None # requiring c_int32
    b= None # requiring c_int32
myci= myclass()
myci.a= c_int32(255)
myci.b= c_int32(0)
mycip= pointer(myci)  # let's say it's Line 8 here
loadso= cdll.LoadLibrary(mydll)
Result= loadso.thefunction (mycip) # int thefunction(ref myclass)

И вывод терминала:

Line 8: TypeError: _type_ must have storage info

Я хотел бы знать 1)что означает это сообщение об ошибке?и 2) способ обойти и передать определенный пользователем класс по ссылке на внешнюю DLL.

Заранее благодарим вас за потраченное время.

1 Ответ

0 голосов
/ 13 июня 2018

Сообщение об ошибке означает, что вы не можете создать ctypes указатель на тип не-ctypes.ctypes типы имеют информацию, необходимую для правильного распределения значений до C.

Чтение ctypes: структуры и объединения .Первое предложение (выделено мной):

Структуры и объединения должны быть производными от базовых классов Structure и Union , которые определены в модуле ctypes.

Например:

>>> from ctypes import *
>>> class Test(Structure):
...   _fields_ = [('a',c_int32),
...               ('b',c_int16),
...               ('c',c_int16)]
...
>>> t = Test(1,2,3)
>>> pointer(t)
<__main__.LP_Test object at 0x00000234A8750A48>
>>> bytes(t)
b'\x01\x00\x00\x00\x02\x00\x03\x00'

Обратите внимание, что указатель может быть взят и что могут отображаться необработанные байты структуры.Структура с прямым порядком байтов и для байта c_int32 выделено четыре байта, а для двух c_int16 членов по два байта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...