2010-12-02 3 views
13

उदाहरण के लिए, पुराने .NET Framework 2.0 स्रोत कोड (विंडोज फॉर्म, विजुअल स्टूडियो 2005 - व्हिडबे) में, (Microsoft से, 2009/2010) एक ही समारोह IntPtr का उपयोग कर परिभाषित किया गया हैजो उपयोग करने के लिए बेहतर/सुरक्षित है: हैंडलरफ या इंटप्रेट (माइक्रोसॉफ्ट से नया स्रोत कोड अब हैंडलरफ का उपयोग नहीं करता है)

[DllImport(ExternDll.User32, ExactSpelling=true, CharSet=CharSet.Auto)] 
    public static extern bool GetClientRect(HandleRef hWnd, [In, Out] ref NativeMethods.RECT rect); 

नए विंडोज एपीआई कोड पैक में: GetClientRect समारोह HandleRef का उपयोग कर परिभाषित किया गया था

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool GetClientRect(IntPtr hwnd, ref CoreNativeMethods.RECT rect); 

असल में हैंडलरफ किसी भी विंडोज एपीआई कोड पैक स्रोत फ़ाइलों में उपयोग नहीं किया जाता है, जबकि इसका उपयोग पुराने .NET Framework स्रोत फ़ाइलों में देशी विधियों के हस्ताक्षरों में भारी रूप से किया जाता था।

+0

[IntPtr, SafeHandle और हैंडलरफ - समझाया गया] के संभावित डुप्लिकेट (http: // stackoverflow।कॉम/प्रश्न/526661/इंटिप्टर-सेफहैंडल-एंड-हैंडलफ-समझाया गया) –

+0

जब संभव हो तो एक सेफहैंडल का उपयोग करें ताकि आपको महत्वपूर्ण अंतिम रूप मिल सके और जीसी की आवश्यकता नहीं है। KeepAlive। – CodesInChaos

+0

@ कोडी ग्रे दोनों प्रश्न, और जब मैं इसे लिखता हूं, तो वास्तव में यहां पूछे जाने वाले प्रश्नों को वास्तव में संबोधित नहीं करते हैं - * एक ही * कार्यों के लिए एमएस स्रोत क्यों एक दूसरे से बदल गया है? – AakashM

उत्तर

9

यह थोड़ा सा मछली है। एक हैंडलरफ व्युत्पन्न ऑब्जेक्ट में मानों को संभालते समय हैंडलरफ की आवश्यकता नहीं होती है। कौन सा कोड पैक घोषित करता है, ज़ीरोइनवाल्डहैंडल, जिसमें से कई व्युत्पन्न वाले लोगों को SafeWindowHandle की तरह बताया जाता है।

हालांकि, यह वास्तव में का उपयोग कहीं भी इन सेफ़हैंडल कक्षाओं में से किसी भी का उपयोग नहीं करता है। यह सुनिश्चित नहीं है कि वास्तव में यह है कि, वास्तव में बहुत सारे Vista और Win7 एक्सटेंशन वास्तव में COM इंटरफेस हैं। पारंपरिक हैंडल आधारित सी एपीआई नहीं है। उन्हें संदर्भ संख्याओं के माध्यम से जीवित रखा जाता है और इस प्रकार इस प्रकार के कचरा कलेक्टर दुर्घटना के अधीन नहीं होते हैं।

व्यक्तिगत रूप से मैं इस बारे में कभी चिंता नहीं करता हूं। क्लास ऑब्जेक्ट प्राप्त करना जबकि एपीआई कॉल निष्पादन एक बग है। यह एपीआई कॉल पूरा होने के बाद आसानी से माइक्रोसॉन्ड के साथ हो सकता है। अभी भी एक बग, केवल एक ऐसा नहीं जो एपीआई कॉल विफल करता है। इतना यकीन नहीं है कि मैं वास्तव में इसे असफल नहीं करना चाहता हूं, जब मुझे अपने कोड में एक बग मिला तो मैं अपवाद को बहुत पसंद करता। माइक्रोसॉफ्ट को इससे खुद को बचाने की जरूरत है, वे अपवाद के लिए दोष नहीं लेना चाहते हैं। मैं करता हूँ।

2

IntPtr केवल संरचना है जो पॉइंटर लपेटती है। हैंडलरफ एमएसडीएन says "हैंडलरफ के साथ एक हैंडल लपेटने की गारंटी है कि प्रबंधित ऑब्जेक्ट कचरा नहीं है जब तक प्लेटफॉर्म का आह्वान कॉल पूरा नहीं हो जाता।" पी/इनवॉक कॉल के बाद यदि आप इसके साथ कुछ भी नहीं करते हैं तो पी/इनवॉक के दौरान जीसी हैंडल को अंतिम रूप दे सकता है। तो हैंडलरफ अधिक सुरक्षित दिखता है।

+0

मुझे वास्तव में पता नहीं है कि "wraps सूचक" से आपका क्या मतलब है। 'IntPtr' के बारे में महत्वपूर्ण बात यह है कि इसका आकार प्लेटफ़ॉर्म-विशिष्ट है (32-बिट वातावरण में 32-बिट्स, 64-बिट वातावरण में 64-बिट्स)। यह आमतौर पर पॉइंटर्स या हैंडल रखने के लिए प्रयोग किया जाता है, लेकिन यह * उन्हें * लपेटता नहीं है। –

+0

IntPtr एक संरचना है, लेकिन वास्तविक सूचक अंदर है और यह पर्यावरण पर निर्भर करता है इसलिए मैंने कहा कि यह लपेटता है। शायद यह गलत है और "पॉइंटर धारण करता है" बेहतर लगता है। मैं सहमत हूं – DReJ

3

मेरा अनुमान है कि नए कोड के नमूने केवल IntPtr का उपयोग करते हैं क्योंकि यह समझना आसान है।

.NET Framework में पाए गए विभिन्न NativeMethods कक्षाओं में फ़ंक्शन हस्ताक्षर पर प्रतिबिंब के माध्यम से एक त्वरित नज़र से पता चलता है कि वास्तविक उपयोग दोनों के बीच बहुत अच्छी तरह से विभाजित है।

मुझे लगता है कि यह ऑब्जेक्ट को कचरे से पहले कचरा होने से रोकने की आवश्यकता है या नहीं (primary advantageHandleRef का उपयोग करने के लिए) है। यह भी ध्यान रखें कि HandleRef का उपयोग करना अनावश्यक है जब तक कि आप जिस हैंडल को पारित कर रहे हैं वह प्रबंधित ऑब्जेक्ट है। अप्रबंधित वस्तुओं को कचरा नहीं मिलेगा।

+2

एक winapi हैंडल * कभी * एक प्रबंधित वस्तु का संदर्भ नहीं देता है। –

+0

@ हंस: यह सच है। जिस भेद को मैं बनाने की कोशिश कर रहा था वह वस्तुओं की तरह वस्तुओं को शामिल करता है, जबकि वास्तव में पूरी तरह से प्रबंधित वस्तुओं को नहीं, कचरा संग्रह के लिए पात्र हैं और जिनके हैंडल संभावित रूप से अमान्य हो सकते हैं यदि उन्हें आपके कोड में दोबारा संदर्भित नहीं किया जाता है। यदि आप इस संभाल को पी/इनवोक फ़ंक्शन में पास कर चुके हैं, तो यह समस्या पैदा कर सकता है। अप्रबंधित वस्तुओं के लिए जिन्हें आपने स्वयं बनाया है, यह कोई समस्या नहीं है क्योंकि वे एकत्रित कचरा नहीं होंगे। –

+1

मुझे पता है, आपका जवाब उसमें शामिल है। बस अंतिम वाक्य बकवास है। –

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

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