Доступ к содержимому объекта, возвращаемого DLL, используя ctypes в Python - PullRequest
0 голосов
/ 19 ноября 2018

DLL возвращает объект при вызове функции с использованием ctypes в python.

Возвращает следующее - скажем, он назван ReturnO;print (ReturnO) дает следующее:

(63484, <DLLname.ClassName object at 0x09D35670>)

Объект должен возвращать параметры;их имена: Paramater_1, Parameter_2 и так далее.У меня вопрос, как мне получить доступ к значениям в Parameter_1, Parameter_2 и т. Д.

, если я делаю печать следующим образом

print(ClassName.Parameter_1)
print(ClassName.Parameter_2)

Я получаю следующее

 Field type=c_float_Array_5, ofs=49483, size=20
 Field type=c_float_Array_5, ofs=49503, size=20

Теперь, как мне получить значение в этом массиве.dotValue (.value) не работает.

Благодарим вас за помощь.Спасибо.

---------------- ДОБАВЛЕНО / ИЗМЕНЕНО ---------- НИЖЕ ------------

ниже код;ценим вашу помощь:

num1=10.1234
int1=10
num11=1.1111
str1=”abcd”

ret=GetOutput_Main(int1,num1,num11,str1)

class ClassName(ctypes.Structure):
  _pack_ = 1
  _fields_ = [("parameter_1", ctypes.c_float * 5),
              ("parameter_2", ctypes.c_float * 5)]

def GetOutput_Main (int2,num2,num22,str2):
    lib = ctypes.WinDLL("mydllname.dll")
    prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_uint32, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ClassName))
    paramflags = (1, "int2",), (1, "num2",), (2, "num22",), (2, "str2",),
    Getoutput_Sub = prototype(("Getoutput", lib), paramflags))
    ret = Getoutput_Sub(int2,num2)
    print(ret) #gives the details of the object
    print(str2.parameter_1) #gives the details of array

печать (в отставку) дает мне:

(63484, <mydllname.ClassName object at 0x09D35670>)

если я делаю печать (str2), я получаю следующее:

<class 'mydllname.ClassName'>

и print (str2.parameter_1) дает мне

Field type=c_float_Array_5, ofs=49483, size=20

я ищу способы распаковать объект, спасибо.

если я это сделаю, где num22 - размер

UnpackedST = struct.unpack(str2,num22)

я получаю следующую ошибку

Struct() argument 1 must be a str or bytes object, not _ctypes.PyCStructType

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Учитывая ваше описание, похоже, у вас есть функция C, подобная следующей:

#include <inttypes.h>

#define API __declspec(dllexport)

struct ClassName
{
    float parameter_1[5];
    float parameter_2[5];
};

API int __stdcall Getoutput(int a, uint32_t b, uint32_t* pc, struct ClassName* pd)
{
    int i;
    *pc = a+b;
    for(i=0;i<5;++i)
    {
        pd->parameter_1[i] = i*.5f;
        pd->parameter_2[i] = i*.25f;
    }
    return a*b;
}

Ваш аргумент paramflags указывает два входа (тип 1) и два возвращаемых значения (тип 2). Просто передайте два обязательных входных значения, а затем проиндексируйте второе возвращаемое значение, чтобы получить доступ к его членам. Используйте list() для преобразования массива в списки Python:

from ctypes import *

class ClassName(Structure):
  _fields_ = [('parameter_1',c_float * 5),
              ('parameter_2',c_float * 5)]

lib = WinDLL('test')
prototype = WINFUNCTYPE(c_int,c_int,c_uint32,POINTER(c_uint32),POINTER(ClassName))
paramflags = (1,'int2'),(1,'num2'),(2,'num22'),(2,'str2')
Getoutput = prototype(('Getoutput',lib),paramflags)

ret = Getoutput(10,11)
print(ret)
print(ret[1].parameter_1)
print(ret[1].parameter_2)
print(list(ret[1].parameter_1))
print(list(ret[1].parameter_2))

Выход:

(21, <__main__.ClassName object at 0x000001DA3A9139C8>)
<__main__.c_float_Array_5 object at 0x000001DA3A790EC8>
<__main__.c_float_Array_5 object at 0x000001DA3A790EC8>
[0.0, 0.5, 1.0, 1.5, 2.0]
[0.0, 0.25, 0.5, 0.75, 1.0]
0 голосов
/ 20 ноября 2018

Если у вас есть массив чисел с плавающей запятой ctypes, есть различные способы получить каждое из чисел с плавающей точкой.

Пример:

Мы начнем с простого поплавкового списка Python, только для демонстрации:

>>> python_float_list = [1.5, 2.5, 3.5, 4.5, 5.5]  

Создание массива с плавающей запятой ctypes из списка:

>>> import ctypes
>>> c_float_array = (ctypes.c_float * 5)(*python_float_list)
>>> c_float_array
<__main__.c_float_Array_5 object at 0x000001D6D9A66A48>

Массивы ctypes могут быть подписаны:

>>> c_float_array[0]
1.5
>>> c_float_array[1]
2.5

Вы также можете использовать цикл for для них:

>>> for f in c_float_array:
    print(f)


1.5
2.5
3.5
4.5
5.5

Поскольку массивы ctypes являются подписанными, вы можете получить список питонов из них:

>>> list(c_float_array)
[1.5, 2.5, 3.5, 4.5, 5.5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...