PInvoke का उपयोग करते समय, मैंने देखा कि हमें विंडोज हैंडल का संदर्भ देने के लिए IntPtr
का उपयोग करने की आवश्यकता है। मैं सोच रहा हूं कि हैंडल के लिए केवल int
का उपयोग क्यों नहीं करें? एक हैंडल की मेरी समझ यह है कि यह सिर्फ एक पूर्णांक मूल्य है।हैंडल के लिए IntPtr का उपयोग क्यों करें?
उत्तर
एक विंडोज हैंडल को देशी मशीन पॉइंटर आकार का एक पूर्णांक के रूप में परिभाषित किया गया है। ऐसा इसलिए है कि अगर वे होने की ज़रूरत है तो वे गुप्त रूप से एक सूचक बन सकते हैं। (एक हैंडल शायद एक सूचक नहीं है, लेकिन यह है, यदि ऑपरेटिंग सिस्टम कार्यान्वयनकर्ता इसे आवश्यक मानते हैं तो वे एक होने के लिए अनुमति देते हैं। वे आम तौर पर सुरक्षा कारणों के लिए संकेतक नहीं होते हैं; यह लोगों के लिए सिस्टम का दुरुपयोग करना बहुत आसान बनाता है यदि वे वास्तव में पॉइंटर्स हैं।)
32 बिट पूर्णांक के रूप में परिभाषित सी # में एक int, जो 64 बिट मशीन पर बहुत छोटा होगा। एक इंट्राट्र को एक पूर्णांक के रूप में परिभाषित किया जाता है जो मशीन के आकार का सूचक रख सकता है। यही कारण है कि आप हैंडल के साथ अंतःक्रिया करते समय हमेशा IntPtr का उपयोग करते हैं।
हैंडल सूचक आकार मान हैं।
वे 64-बिट प्लेटफ़ॉर्म पर 8 बाइट चौड़े हैं।
मैं "पॉइंटर" के बजाय "पॉइंटर- * आकार * * कहूंगा (भले ही मुझे सख्त सी/सी ++ भावना में लगता है, यह बहुत सटीक नहीं है, चूंकि हैंडल एक टाइपर के रूप में टाइप किए गए हैं, और 'size_t' जरूरी नहीं है कि पॉइंटर का आकार हो) ... लेकिन यदि वे किसी तालिका में इंडेक्स हैं, संभावना है कि वे पूर्णांक के रूप में उपयोग किए जाते हैं। लेकिन हाँ, बिंदु ले लिया। – Mehrdad
अच्छा विचार; चोरी हो गया – SLaks
एक हैंडल अनिवार्य रूप से एक सिस्टम स्तर सूचक है, और एक सूचक निश्चित रूप से एक int को नहीं डाला जाता है। यह स्वयं ही एक प्रकार है। इसलिए यही है कि हैंडल प्रकार का प्रतिनिधित्व करने के लिए आपके पास IntPtr
.NET में है।
एक हैंडल का आकार मशीन आर्किटेक्चर (32/64 बिट) पर निर्भर है। IntPtr
इसका ख्याल रखेगा।
- 1. के लिए हैंडल क्या हैं? IntPtr
- 2. int बनाम IntPtr जब आपके पास हैंडल है?
- 3. सुरक्षित हैंडल क्यों है। खतरनाक गेटहैंडल() "खतरनाक"?
- 4. C# संकेत बनाम IntPtr
- 5. क्या मैं IntPtr के बजाय SafeHandle का उपयोग कर सकता हूं?
- 6. एक कर्ल हैंडल का उचित पुन: उपयोग कैसे करें
- 7. सेलेनियम webdriver के वर्तमान विंडो GUID से विंडो हैंडल (IntPtr) जाओ
- 8. structs को intPtr
- 9. IntPtr को असुरक्षित कीवर्ड की आवश्यकता क्यों नहीं है?
- 10. पर्ल इनपुट और कीबोर्ड इनपुट के लिए पर्ल को विभिन्न हैंडल का उपयोग कैसे करें?
- 11. IntPtr बनाम UIntPtr
- 12. डेटा स्रोतों के लिए जेएनडीआई का उपयोग क्यों करें
- 13. का उपयोग क्यों करें बफ़र्स को पढ़ने के लिए/स्ट्रीम
- 14. कतार बनाने के लिए दो ढेर का उपयोग क्यों करें?
- 15. एप्लिकेशन लॉगिंग के लिए सिंगलटन का उपयोग क्यों करें?
- 16. scala.collection.immutable का उपयोग क्यों करें।
- 17. java.io.Console का उपयोग क्यों करें?
- 18. सी # में IntPtr कैसे मुक्त करें?
- 19. प्रिज्म का उपयोग क्यों करें?
- 20. NSObjectController का उपयोग क्यों करें
- 21. HWND से IntPtr (CLI)
- 22. @PostConstruct का उपयोग क्यों करें?
- 23. डायलॉगफ्रैगमेंट का उपयोग क्यों करें?
- 24. हेक्स का उपयोग क्यों करें?
- 25. केकपीएचपी के जेएसहेल्पर का उपयोग क्यों करें?
- 26. NSFetchedResultsController का उपयोग क्यों करें?
- 27. हैशपैप का उपयोग क्यों करें?
- 28. सी # IntPtr int
- 29. mysqli_close() का उपयोग क्यों करें?
- 30. प्रयोगशाला का उपयोग क्यों करें?
आपकी सबसे आम गलती है जो x64 असंगतताओं का कारण बनती है। – SLaks
निश्चित रूप से, वे पूर्णांक मान हैं। लेकिन किसी ने भी नहीं कहा कि उन्हें 32 बिट्स होना चाहिए ... – Mehrdad