python ctypes pywin32

python - ctypes: construir puntero a partir de entero arbitrario



pywin32 (1)

Puedes usar ctypes.cast(addr, type) . Extenderé su ejemplo para adquirir una dirección a través de un objeto conocido, para demostrar:

INTP = ctypes.POINTER(ctypes.c_int) num = ctypes.c_int(42) addr = ctypes.addressof(num) print ''address:'', addr, type(addr) ptr = ctypes.cast(addr, INTP) print ''pointer:'', ptr print ''value:'', ptr[0]

Salida:

address: 4301122528 <type ''int''> pointer: <__main__.LP_c_int object at 0x1005decb0> value: 42

Para propósitos de bajo nivel, necesito construir un puntero de ctypes desde una dirección arbitraria, dado como un entero. Por ejemplo:

INTP = ctypes.POINTER(ctypes.c_int) p = INTP(0x12345678) # i *know* this is the address

Pero todos esos intentos resultan en

TypeError: expected c_long instead of int

¿Hay algo que pueda hacer para superar esto? En caso de que alguien se pregunte por qué necesito esto, se hace para extraer la estructura OVERLAPPED de un win32file.PyOVERLAPPED , para integrar las funciones expuestas de ctypes con las API envueltas en el archivo win32file.

Gracias,
-Tomador