Python ctypes将指针传递给指向结构体动态分配的指针



我正在尝试使用python ctypes将适当的变量和指针传递给DLL文件中的函数。

下面是DLL文档中提供的函数描述:

原型:Picam_GetAvailableDemoCameraModels(const PicamModel** model_array, piint* model_count)

Description:返回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
'@~xe7x02'

我想我做了一些错误的事情来处理指针(双指针?)不正确,但我不能确定我在哪里偏离了定义的语法。

在我看来,我的语法正在传递一个指针到一个指针到一个结构体,但是我希望结果是结构体(PicamCameraID)的数组。如果它只是一个结构体,那么数组中只能有一个模型。然而,我不知道数组中有多少模型,直到函数运行之后……我不确定如何(或者即使我必须)处理这个问题。

如有任何见解,我将不胜感激,如果我能在任何地方详细说明,请告诉我。

我能够根据一个旧帖子回答我自己的问题

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和ctypes:如何正确传递"指针到指针"成DLL吗?查看详细信息

最新更新