我正在尝试使用 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”在提供的头文件之一中定义如下:
typedef char pichar; /* character native to platform
这看起来很简单,但由于某种原因对我来说不起作用。
我的理解如下:我给函数传递了三个变量:
1) a model
,实际上是 a 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 中定义的结构相对应的变量类型。我的直觉是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;