2011-04-25 11 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 से निकालने के लिए किया गया है, ताकि Win32file wrapped API के साथ ctypes- खुला कार्यों को एकीकृत किया जा सके।

धन्यवाद,
-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

+1

@sebulba: और यदि ऐसा होता है, तो उत्तर को सही के रूप में चिह्नित करें, कृपया :) – vines

संबंधित मुद्दे