在Python中使用ctypes返回结构

前端之家收集整理的这篇文章主要介绍了在Python中使用ctypes返回结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在编写一个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

猜你在找的Python相关文章