加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在Python中使用ctypes返回结构

发布时间:2020-12-16 22:01:23 所属栏目:Python 来源:网络整理
导读:我正在编写一个Python程序,它从海康威视有限公司生产的IP摄像机读取YV12帧数据. 在SDK中,他们提供了一个函数调用,允许我设置一个Callback来检索Frame Data. 我的回调函数是这样的: def py_fDecodeCallBack(lPort,pBuffer,lSize,pFrameInfo,lReserved1,lRese

我正在编写一个Python程序,它从海康威视有限公司生产的IP摄像机读取YV12帧数据.

在SDK中,他们提供了一个函数调用,允许我设置一个Callback来检索Frame Data.

我的回调函数是这样的:

def py_fDecodeCallBack(lPort,pBuffer,lSize,pFrameInfo,lReserved1,lReserved2):
    print "lPort: %r" % lPort
    print "lSize: %r   " % lSize
    print pFrameInfo
    print pBuffer
    print "pFrame Info: %r   " % pFrameInfo.nWidth

    return 0

$
pFramInfo的结构定义如下:

class FRAME_INFO(Structure):
        _fields_ =[
                   ('nWidth',c_long),('nHeight',('nStamp',('nType',('nFrameRate',('dwFrameNum',wintypes.DWORD)
                   ]

$

我使用以下代码来设置回调函数:

FSETDECCALLBACK = WINFUNCTYPE(c_bool,c_long,POINTER(wintypes.BYTE),POINTER(FRAME_INFO),c_long)
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)    

然后SDK调用回调函数,它打印出以下内容:

Traceback (most recent call last):
  File "_ctypes/callbacks.c",line 313,in 'calling callback function'
lPort: 0
lSize: 1382400   

正确读取了c_long(lPort和lSize)这样的简单类型,但pFrameInfo结构没有我定义的字段.我无法读取pFrameInfo.nWidth,因为它说没有这样的属性……

我的问题是:
如何通过ctypes读取从dll返回的结构中的属性.我在谷歌上看不到任何关于这方面的例子,我在python.org http://bugs.python.org/issue5710中发现了一个主题,说这是无法完成的,但是这条消息是在2009年写的.

我相信,由于已经从dll中读取了pFrameInfo,有没有办法通过剪切和读取pFrameInfo的内存空间中的字节来获取存储在pFrameInfo结构中的c_long数据?由于pFrameInfo的所有属性都是c_long,因此可以逐字节读取结构,可以重构c_long变量的值.我只是在猜测.请帮忙,对我来说这是一个非常大的问题…

最佳答案
我认为您需要取消引用指向FRAME_INFO的指针:

frameInfo = pFrameInfo.contents
...
print "pFrame Info: %r   " % frameInfo.nWidth

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读