2012-09-03 14 views
5

Estoy escribiendo un programa en Python, que lee los datos del marco YV12 de una cámara IP producida por Hikvision Ltd.Devolución de una estructura utilizando ctypes en Python

En el SDK, que proporcionaron una llamada funcional que me permite configurar una devolución de llamada para recuperar los datos del cuadro.

función

Mi devolución de llamada es la siguiente:

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 

$ La estructura de pFramInfo se define así:

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

$

utilizo el siguiente código para configurar la devolución de llamada función:

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

Entonces la función de devolución de llamada está siendo llamado por el SDK y se imprime el siguiente:

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' 

tipos simples como c_long (lport y lSize) están siendo leído correctamente, pero la estructura pFrameInfo no tiene los campos que Lo he definido No puedo leer pFrameInfo.nWidth ya que dice que no hay tal atributo ...

Mi pregunta es: ¿Cómo puedo leer los atributos en la estructura devuelta desde el dll a través de ctypes. No puedo ver ningún ejemplo en Google haciendo esto, y me encontré con un tema en python.org http://bugs.python.org/issue5710 decir esto simplemente no se puede hacer, pero el mensaje está escrito en 2009.

Creo que como pFrameInfo ya está siendo leído desde el dll, ¿hay alguna forma de recuperar los datos c_long almacenados en la estructura pFrameInfo cortando y leyendo los bytes en el espacio de memoria de pFrameInfo? Dado que todos los atributos de pFrameInfo son c_long, puede leer la estructura byte por byte y puede reconstruir el valor de las variables c_long. Solo estoy adivinando. Por favor, ayuda, este es un problema muy grande para mí ...

Respuesta

4

creo que necesita para eliminar la referencia de su puntero a FRAME_INFO:

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

Wow! ¡¡¡Muchas gracias!!! ¡¡Funcionó!! Ahora puedo acceder a todos los contenidos dentro de la estructura. –

Cuestiones relacionadas