我正在尝试使用python ctypes将适当的变量和指针传递给DLL文件中的函数。
以下是DLL文档中提供的函数说明:
原型:Picam_GetAvailableDemoCameraModels(const PicamModel ** model_array,piint * model_count)
描述:在model_array中返回已分配的软件模拟相机模型数组,其项目数在model_count中
注意:model_array由picam分配,必须使用 Picam_DestroyModels。
进一步注意piint被映射到一个整数,而model_array被映射到一个struct。我这样做的python语法如下:
PicamStringSize_SensorName = PicamStringSize_SerialNumber = 64
PicamModel = PicamComputerInterface = ctypes.c_int
pichar = ctypes.c_char
piint = ctypes.c_int
class PicamCameraID(ctypes.Structure):
_fields_ = [("model", PicamModel),
("computer_interface", PicamComputerInterface),
("sensor_name", pichar * PicamStringSize_SensorName),
("serial_number", pichar * PicamStringSize_SerialNumber)]
然后我尝试按如下方式调用该函数:
"""Picam_GetAvailableDemoCameraModels( const PicamModel** model_array,
piint* model_count )"""
model_count = ctypes.c_int()
x = PicamCameraID()
model_array = pointer(pointer(x))
err = picam.Picam_GetAvailableDemoCameraModels( model_array, pointer(model_count))
运行之后,我能够读取model_count变量(告诉我其中有133个项目)并且我能够访问model_array的内容,但内容不正确或无用,例如。
model_count
c_long(133)
model_array[5].contents.sensor_name
'@~\xe7\x02'
我认为我对错误地处理指针(双指针?)的效果做错了,但我无法确定我从定义的语法中偏离了什么。
在我看来,我的语法传入一个指向指针到结构的指针,但是我希望结果是一个数组(PicamCameraID)。如果它只是一个结构,我只能在数组中有一个模型。但是,我不知道在函数运行之后数组中有多少个模型...而且我不确定如何(或者即使我必须)处理它。
任何见解都会非常感激,如果我能在任何地方详细说明,请告诉我。
此致
答案 0 :(得分:0)
我能够根据旧帖子回答我自己的问题
getDemos = picam.Picam_GetAvailableDemoCameraModels
getDemos.argtypes = [ctypes.POINTER(ctypes.POINTER(PicamCameraID)) , ctypes.POINTER(piint)]
mem = ctypes.POINTER(PicamCameraID)()
size = ctypes.c_int(0)
getDemos(ctypes.byref(mem), ctypes.byref(size))
print size.value
有关详细信息,请参阅Python and ctypes: how to correctly pass "pointer-to-pointer" into DLL?