2012-09-03 49 views
5

我用Python写一个程序的结构,即由海康威视公司返回使用ctypes的Python中

在SDK制作的IP摄像机读取YV12帧数据,他们提供的功能调用,让我设置一个回调以检索帧数据。

我的回调函数是这样的:

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', c_long), 
        ('nStamp', c_long), 
        ('nType', c_long), 
        ('nFrameRate', c_long), 
        ('dwFrameNum', wintypes.DWORD) 
        ] 

$

我用下面的代码来设置回调功能:

FSETDECCALLBACK = WINFUNCTYPE(c_bool, c_long, POINTER(wintypes.BYTE), c_long, POINTER(FRAME_INFO), c_long, 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 
<mytypes.LP_FRAME_INFO object at 0x03109CB0> 
<wintypes2.LP_c_byte object at 0x03109D00> 
    File "C:\Users\Rex\workspace\iSentry\hcnetsdkhelper.py", line 76, in py_fDecodeCallBack 
    print "pFrame Info: %r " % pFrameInfo.nWidth 
AttributeError: 'LP_FRAME_INFO' object has no attribute 'nWidth' 

简单的类型,如c_long(LPORT和lSize所)被正确读取,但pFrameInfo结构没有字段我已经定义。我无法阅读pFrameInfo.nWidth,因为它说没有这样的属性...

我的问题是: 我怎样才能读取通过ctypes从dll返回的结构中的属性。我看不到在谷歌这样做的任何例子,我发现在python.org http://bugs.python.org/issue5710一个主题,说这是不能做到,但消息是在2009年编写。

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

回答

4

我想你需要取消引用指针到FRAME_INFO:

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

哇!非常感谢!!!有效!!现在我可以访问结构中的所有内容。 –

相关问题