2012-09-03 54 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

哇!非常感謝!!!有效!!現在我可以訪問結構中的所有內容。 –

相關問題