Python ctypes を使用して、適切な変数とポインターを DLL ファイル内の関数に渡そうとしています。
以下は、DLL ドキュメントで提供されている関数の説明です。
プロトタイプ: Picam_GetAvailableDemoCameraModels( const PicamModel** model_array, piint* model_count )
説明: 項目数が model_count である、model_array 内のソフトウェアでシミュレートされたカメラ モデルの割り当てられた配列を返します。
注: 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 つのモデルしか持てませんでした。ただし、関数が実行されるまで、配列にいくつのモデルがあるかわかりません...そして、それを処理する方法がわかりません(または、処理する必要がある場合でも)。
どこかで詳しく説明できる場合はお知らせください。
よろしく