2011-04-25 138 views
20

对于低级别目的,我需要从任意地址构造一个ctypes指针,以整数形式给出。例如:ctypes:从任意整数构造指针

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

但所有这些尝试导致

TypeError: expected c_long instead of int 

有什么我可以做来克服这个?如果有人想知道为什么我需要这样做,那么可以从win32file.PyOVERLAPPED中提取OVERLAPPED结构,以将ctypes暴露的函数与win32file封装的API集成。

感谢,
-Tomer

回答

31

您可以使用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 
+0

,做的伎俩,谢谢! – sebulba 2011-04-26 08:34:31

+1

@sebulba:如果有,请将答案标记为正确,请:) – vines 2011-05-26 14:32:06