Подтвердить что ты не робот

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

4b9b3361

Ответ 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