Ctypes: построить указатель из произвольного целого
Для целей низкого уровня мне нужно построить указатель ctypes с произвольного адреса, заданного как целое число. Например:
INTP = ctypes.POINTER(ctypes.c_int)
p = INTP(0x12345678) # i *know* this is the address
Но все такие попытки приводят к
TypeError: expected c_long instead of int
Есть ли что-нибудь, что я могу сделать, чтобы преодолеть это? В случае, если кто-то задается вопросом, зачем мне это нужно, он сделал так, чтобы извлечь структуру OVERLAPPED
из win32file.PyOVERLAPPED
, для интеграции открытых функций ctypes с обернутыми API-интерфейсами win32file.
Спасибо,
-Tomer
Ответы
Ответ 1
Вы можете использовать ctypes.cast(addr, type)
. Я продолжу ваш пример, чтобы получить адрес через известный объект, чтобы продемонстрировать:
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]
Вывод:
address: 4301122528 <type 'int'>
pointer: <__main__.LP_c_int object at 0x1005decb0>
value: 42