2012-02-07 5 views
10

PInvoke का उपयोग करते समय, मैंने देखा कि हमें विंडोज हैंडल का संदर्भ देने के लिए IntPtr का उपयोग करने की आवश्यकता है। मैं सोच रहा हूं कि हैंडल के लिए केवल int का उपयोग क्यों नहीं करें? एक हैंडल की मेरी समझ यह है कि यह सिर्फ एक पूर्णांक मूल्य है।हैंडल के लिए IntPtr का उपयोग क्यों करें?

+7

आपकी सबसे आम गलती है जो x64 असंगतताओं का कारण बनती है। – SLaks

+5

निश्चित रूप से, वे पूर्णांक मान हैं। लेकिन किसी ने भी नहीं कहा कि उन्हें 32 बिट्स होना चाहिए ... – Mehrdad

उत्तर

18

एक विंडोज हैंडल को देशी मशीन पॉइंटर आकार का एक पूर्णांक के रूप में परिभाषित किया गया है। ऐसा इसलिए है कि अगर वे होने की ज़रूरत है तो वे गुप्त रूप से एक सूचक बन सकते हैं। (एक हैंडल शायद एक सूचक नहीं है, लेकिन यह है, यदि ऑपरेटिंग सिस्टम कार्यान्वयनकर्ता इसे आवश्यक मानते हैं तो वे एक होने के लिए अनुमति देते हैं। वे आम तौर पर सुरक्षा कारणों के लिए संकेतक नहीं होते हैं; यह लोगों के लिए सिस्टम का दुरुपयोग करना बहुत आसान बनाता है यदि वे वास्तव में पॉइंटर्स हैं।)

32 बिट पूर्णांक के रूप में परिभाषित सी # में एक int, जो 64 बिट मशीन पर बहुत छोटा होगा। एक इंट्राट्र को एक पूर्णांक के रूप में परिभाषित किया जाता है जो मशीन के आकार का सूचक रख सकता है। यही कारण है कि आप हैंडल के साथ अंतःक्रिया करते समय हमेशा IntPtr का उपयोग करते हैं।

10

हैंडल सूचक आकार मान हैं।

वे 64-बिट प्लेटफ़ॉर्म पर 8 बाइट चौड़े हैं।

+1

मैं "पॉइंटर" के बजाय "पॉइंटर- * आकार * * कहूंगा (भले ही मुझे सख्त सी/सी ++ भावना में लगता है, यह बहुत सटीक नहीं है, चूंकि हैंडल एक टाइपर के रूप में टाइप किए गए हैं, और 'size_t' जरूरी नहीं है कि पॉइंटर का आकार हो) ... लेकिन यदि वे किसी तालिका में इंडेक्स हैं, संभावना है कि वे पूर्णांक के रूप में उपयोग किए जाते हैं। लेकिन हाँ, बिंदु ले लिया। – Mehrdad

+1

अच्छा विचार; चोरी हो गया – SLaks

2

एक हैंडल अनिवार्य रूप से एक सिस्टम स्तर सूचक है, और एक सूचक निश्चित रूप से एक int को नहीं डाला जाता है। यह स्वयं ही एक प्रकार है। इसलिए यही है कि हैंडल प्रकार का प्रतिनिधित्व करने के लिए आपके पास IntPtr .NET में है।

4

एक हैंडल का आकार मशीन आर्किटेक्चर (32/64 बिट) पर निर्भर है। IntPtr इसका ख्याल रखेगा।

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