【发布时间】:2013-06-01 00:03:59
【问题描述】:
我正在尝试使用 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) 一个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))
如您所见,我正在尝试创建与 DLL 中定义的 PicamCameraID 结构相对应的变量类型。我的直觉是在将参数传递给函数时使用ctypes.pointer 命令来引用它,但我发现使用ctypes.byref 而不是elsewhere 的迹象。
代码运行没有错误(返回 0),但是,当我尝试访问结构 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;
【问题讨论】:
-
什么是
pichar?字符串的大小是如何确定的?如果你直接传递serialnum而没有pointer()调用会发生什么? -
J.F. ——感谢您的回复。我的头文件告诉我以下内容: typedef char pichar; /* 平台原生字符,换句话说,我相信它只是重新映射 char?
标签: python pointers struct ctypes