dll在使用python中的ctypes调用函数时返回一个对象。
它返回以下内容-说它名为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
打印(ret)给我:
(63484, <mydllname.ClassName object at 0x09D35670>)
如果我打印(str2),则会得到以下信息:
<class 'mydllname.ClassName'>
然后打印(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
答案 0 :(得分:0)
如果您有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数组是可订阅的,因此您可以从中获取python列表:
>>> list(c_float_array)
[1.5, 2.5, 3.5, 4.5, 5.5]
答案 1 :(得分:0)
鉴于您的描述,您似乎拥有一个类似于以下内容的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]