我正在尝试使用 python ctypes 将适当的变量和指针传递给 DLL 文件中的函数。
下面是DLL文档中提供的函数描述:
原型:Picam_GetAvailableDemoCameraModels( const PicamModel** model_array, piint* model_count )
说明:返回一个分配的模型数组中的软件模拟相机模型,其项目数在模型计数中
注意:model_array 由 picam 分配,必须用 Picam_DestroyModels 释放。
进一步注意 piint 被映射到一个整数和 model_array 被映射到一个结构。我执行此操作的 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)。如果它只是一个结构,我只能在数组中有 1 个模型。但是,直到函数运行之后,我才知道数组中有多少模型......而且我不确定如何(或者即使我必须)处理它。
任何见解将不胜感激,如果我可以在任何地方详细说明,请告诉我。
问候