簡體   English   中英

在Python中使用ctypes返回結構

[英]Returning a Structure using ctypes in Python

我正在用Python編寫程序,該程序將從由Hikvision Ltd生產的IP攝像機讀取YV12幀數據。

在SDK中,他們提供了一個函數調用,該函數調用使我可以設置回調以檢索幀數據。

我的回調函數是這樣的:

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返回的結構中的屬性。 我在Google上沒有看到任何這樣做的例子,並且在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM