ctypes: создать указатель из произвольного целого числа - PullRequest
21 голосов
/ 26 апреля 2011

Для целей низкого уровня мне нужно создать указатель 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 Ответ

32 голосов
/ 26 апреля 2011

Вы можете использовать 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
...