为了账号安全,请及时绑定邮箱和手机立即绑定

使用Python Ctypes将结构指针传递给DLL函数

使用Python Ctypes将结构指针传递给DLL函数

qq_花开花谢_0 2021-03-10 13:10:47
我正在尝试使用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中定义的一些变量类型。接下来介绍这些变量PicamModelType: enumDescription: The camera model.PicamCameraIDType: Struct- PicamModel model: _model_ is the camera model- PicamComputerInterface computer_interface: computer_interface is the method ofcommunication- pichar sensor_name [PicamStringSize_SensorName]: sensor_name contains the name ofthe sensor in the camera- pichar serial_number [PicamStringSize_SerialNumber]: serial_number contains theunique serial number of the camera请注意,在提供的头文件之一中定义了“ pichar”,如下所示:typedef          char   pichar; /* character native to platform   这似乎很简单,但是由于某种原因对我来说却没有解决。我的理解如下:我向函数传递了三个变量: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 ptrclass PicamCameraID(ctypes.Structure):      passPicamCameraID._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,而不是其他地方
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

您对PicamCameraID结构的定义不正确:sensor_name并且serial_number是arrays:


"""

struct PicamCameraID {

  PicamModel             model;

  PicamComputerInterface computer_interface;

  pichar                 sensor_name[PicamStringSize_SensorName];

  pichar                 serial_number[PicamStringSize_SerialNumber]; 

};

"""

import ctypes as c


PicamStringSize_SensorName = PicamStringSize_SerialNumber = 64

PicamModel = PicamComputerInterface = c.c_int

pichar = c.c_char


class PicamCameraID(c.Structure):

    _fields_ = [("model", PicamModel),

                ("computer_interface", PicamComputerInterface),

                ("sensor_name", pichar * PicamStringSize_SensorName),

                ("serial_number", pichar * PicamStringSize_SerialNumber)]

似乎第二个参数只是一个字符串,因此您无需对其进行应用pointer()。这是功能的ctypes原型Picam_ConnectDemoCamera():


"""

Picam_ConnectDemoCamera(PicamModel model, const pichar* serial_number,

                        PicamCameraID* id)

"""

pichar_p = c.c_char_p # assume '\0'-terminated C strings

Picam_ConnectDemoCamera.argtypes = [PicamModel, pichar_p,

                                    c.POINTER(PicamCameraID)]

Picam_ConnectDemoCamera.restype = c.c_int # assume it returns C int

调用它:


picam_id = PicamCameraID()

rc = Picam_ConnectDemoCamera(2, "serial number here", c.byref(picam_id))

print(rc)

print(picam_id.sensor_name.value) # C string

print(picam_id.sensor_name.raw)   # raw memory


查看完整回答
反对 回复 2021-03-29
  • 2 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号