ctypes: construire un pointeur à partir d'un entier arbitraire
À des fins de bas niveau, j'ai besoin de construire un pointeur ctypes à partir d'une adresse arbitraire, donnée en entier. Par exemple:
INTP = ctypes.POINTER(ctypes.c_int)
p = INTP(0x12345678) # i *know* this is the address
Mais toutes ces tentatives aboutissent à
TypeError: expected c_long instead of int
Y a-t-il quelque chose que je puisse faire pour surmonter cela? Dans le cas où quelqu'un se demande pourquoi j'ai besoin de cela, c'est fait de manière à extraire la structure OVERLAPPED
d'un win32file.PyOVERLAPPED
, pour intégrer des fonctions exposées à ctypes avec des API encapsulées win32file.
Merci,
- Tomer
21
demandé sur
sebulba
2011-04-26 02:03:25
1 réponses
Vous pouvez utiliser ctypes.cast(addr, type)
. Je vais étendre votre exemple pour acquérir une adresse via un objet connu, pour démontrer:
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]
Sortie:
address: 4301122528 <type 'int'>
pointer: <__main__.LP_c_int object at 0x1005decb0>
value: 42
31
répondu
samplebias
2011-04-25 23:10:21