Python ctypes を使用して DLL ファイル内の関数にアクセスしようとしています。提供される機能の説明は以下のとおりです。
Prototype: Picam_ConnectDemoCamera( PicamModel model,
const pichar* serial_number,
PicamCameraID* id )
Description: Virtually connects the software-simulated 'model' with 'serial_number'
and returns the camera id in `_id_`
Notes: `_id_` is optional and can be null
この関数は、DLL で定義されているいくつかの変数の型を参照します。これらの変数については次に説明します
PicamModel
Type: enum
Description: The camera model.
PicamCameraID
Type: Struct
- PicamModel model: _model_ is the camera model
- PicamComputerInterface computer_interface: computer_interface is the method of
communication
- pichar sensor_name [PicamStringSize_SensorName]: sensor_name contains the name of
the sensor in the camera
- pichar serial_number [PicamStringSize_SerialNumber]: serial_number contains the
unique serial number of the camera
「pichar」は、提供されているヘッダー ファイルの 1 つで次のように定義されていることに注意してください。
typedef char pichar; /* character native to platform
これは簡単に思えますが、何らかの理由でうまくいきません。
私の理解は次のとおりです。関数に 3 つの変数を渡します。
1) a model
、これは実際にはenum
です。Python ctypes は本質的に列挙型をサポートしていないと言われたため、特定のモデル タイプにマップされる整数 2 を渡しています。
2) シリアル番号へのポインタ (私はこれを作ることができます: 任意の文字列)
3)型PicamCameraID
に基づく、DLL 内で定義された変数型へのポインターstruct
SOを読んだ後、いくつかの良い出発点を見つけましたが、まだ運が尽きています。今までのベストショットはこちら
def pointer(x):
PointerToType = ctypes.POINTER(type(x))
ptr = ctypes.cast(ctypes.addressof(x), PointerToType)
return ptr
class PicamCameraID(ctypes.Structure):
pass
PicamCameraID._fields_=[("model",ctypes.c_int),
("computer_interface",ctypes.c_int),
("sensor_name",ctypes.c_char_p),
("serial_number",ctypes.c_char_p)]
myid = PicamCameraID()
model = ctypes.c_int(2)
serialnum = ctypes.c_char_p('asdf')
print picam.Picam_ConnectDemoCamera(model, pointer(serialnum), ctypes.byref(myid))
ご覧のとおりPicamCameraID
、DLL で定義された構造体に対応する変数の型を作成しようとしています。私の直感では、引数を関数に渡すときにコマンドを使用して this を参照することでしたが、代わりに別の場所でctypes.pointer
使用する指示を見つけました。ctypes.byref
コードはエラーなしで実行されます (0 が返されます) が、 struct のプロパティにアクセスしようとすると、さまざまな結果が得られますPicamCameraID
。
myid.model
「2」を返します。これは私が指定したものです
myid.computer_interface
。「1」を返します。これは問題ありません。
しかし、問題はmyid.serial_number
返品です
Traceback (most recent call last): File "<pyshell#28>", line 1, in
<module>
myid.serial_number ValueError: invalid string pointer 0x2820303031207820
そしてmyid.sensor_name
戻ります:
Traceback (most recent call last): File "<pyshell#29>", line 1, in
<module>
myid.sensor_name ValueError: invalid string pointer 0x3034333120563245
何らかの理由で、これらの文字列が適切に入力されていませんか?
どんなアイデアでも大歓迎です。私はpython ctypes(およびc)の初心者です
敬具
2013年6月1日追加
typedef enum PicamStringSize {
PicamStringSize_SensorName = 64,
PicamStringSize_SerialNumber = 64,
PicamStringSize_FirmwareName = 64,
PicamStringSize_FirmwareDetail = 256 } PicamStringSize;
typedef struct PicamCameraID {
PicamModel model;
PicamComputerInterface computer_interface;
pichar sensor_name[PicamStringSize_SensorName];
pichar serial_number[PicamStringSize_SerialNumber];
} PicamCameraID;