2011-10-10 16 views
8

.NET Framework में SafeHandleZeroOrMinusOneIsInvalid कक्षा के साथ-साथ SafeHandleMinusOneIsInvalid कक्षा भी है।शून्य कभी वैध संभाल है?

यह क्यों है? किस स्थितियों में शून्य कभी वैध संभाल है?

+0

मुझे लगता है कि आज शून्य कभी वैध संभाल नहीं है; अभी मैं विंडोज 7 पर प्रोसेस एक्सप्लोरर में देख रहा हूं और मानों को 4 से शुरू करता हूं (छवि फ़ाइल निष्पादन विकल्प रजिस्ट्री कुंजी, दिलचस्प रूप से)। मुझे संदेह है कि यह समय से पहले है जहां शायद कुछ प्राचीन Win16 या DOS फ़ंक्शन जो फ़ाइल खोलता है, शून्य के मान के साथ एक हैंडल या डिस्क्रिप्टर वापस कर सकता है। आज, 0 और -1 विशेष अमान्य मान हैं इसलिए मैं कल्पना नहीं कर सकता कि आपको कभी भी वैल्यू के साथ एक मान्य हैंडल मिलेगा। आप जांच सकते हैं कि कौन से .NET एपीआई सुरक्षित हैंडलमिनसऑनइन्स इनवालिड का उपयोग करते हैं; शायद यह आपको कुछ संकेत देगा। – Luke

+0

@ ल्यूक: हो सकता है ... लेकिन फिर भी, जब वे .NET 2.0 में सेफहैंडल को डिज़ाइन कर रहे थे तो वे Win16/DOS के बारे में क्यों परवाह करेंगे? – Mehrdad

+0

शायद कोई सीधा लिंक नहीं था, लेकिन बाकी सब कुछ के ऊपर सबकुछ बनाया गया है, इसलिए पिछड़ा संगतता एक महत्वपूर्ण विचार है। विंडोज 98 पर .NET 2.0 रन, आप जानते हैं; जब आप इसके बारे में सोचते हैं तो यह प्रभावशाली होता है। – Luke

उत्तर

6

अन्य उत्तरों के लिए अतिरिक्त व्याख्यान के रूप में, this OldNewThing blog entry असंगत हैंडल रिटर्न मानों के बारे में देखें।

+0

आपको एक लिंक के पीछे नहीं, विस्तृत करना चाहिए। – tenfour

+0

आप बिल्कुल सही हैं। अगर आपको लगता है कि कुछ भी गुम है, तो मेरा जवाब संपादित करने के लिए स्वतंत्र महसूस करें। असल में मुझे टिप्पणी के रूप में भी पोस्ट करना चाहिए था, क्योंकि यह वास्तव में सवाल का जवाब नहीं देता है। लेकिन मैं अपने दस अंक चूक गया होगा: डी।इसके अलावा मैं किसी को भी रेमंड के अद्भुत ब्लॉग की खोज करने से नहीं रोकना चाहता था (और मैं केवल वहां से टेक्स्ट कॉपी कर सकता था, जो मुझे समय बर्बाद कर रहा था) – MartinStettner

+0

@ मार्टिनस्टेटनर: यह एक स्वीकार्य रूप से अच्छा लिंक है, लेकिन यह नहीं कहता .NET wrappers के बारे में कुछ भी, यानी क्यों 'SafeHandleMinusOneIsInvalid' बिल्कुल मौजूद है। वैसे भी +1, लेकिन मुझे संदेह है कि मैं इसे स्वीकार करूँगा। : पी – Mehrdad

3

हां। शून्य stdin के लिए फ़ाइल हैंडल है। शून्य होने पर गैर कर्नेल हैंडल मान्य नहीं हैं।

+0

http://en.wikipedia.org/wiki/File_descriptor – mellamokb

+3

एक Win32 फ़ाइल हैंडल एक POSIX/C फ़ाइल डिस्क्रिप्टर – jalf

+0

के समान नहीं है ReadFile को 0 पास करना अभी भी STDIN पढ़ता है। – Joshua

3

के रूप में उनके documentation में माइक्रोसॉफ्ट द्वारा प्रस्तुत (और Joshua, द्वारा विवरण में प्रदर्शन किया) यह कार्यान्वयन निर्भर है, इसलिए बात करने के लिए:

यह गलत हैंडल के प्रारूप का वर्णन है।

उदाहरण के लिए, कुछ हैंडल का उपयोग -1 गलत संभाल मूल्य के रूप में, जबकि दूसरों को 0 का उपयोग करें। इस वर्ग के व्युत्पन्न (उदाहरण के लिए, फ़ाइल या रजिस्ट्री हैंडल) विशेषज्ञ कर सकते हैं। SafeHandleZeroOrMinusOneIsInvalid से प्राप्त कक्षा के उदाहरण के लिए SafeFileHandle क्लास देखें।

+0

मजाकिया बात यह है कि सुरक्षितफाइल हैंडल * गलत * बनाता है। – Joshua

+2

यह तब भी नहीं कहता है जब शून्य है ** मान्य ** एक हैंडल के रूप में ... – Mehrdad

1

मुझे लगता है कि आप नाम में बहुत अधिक पढ़ रहे हैं: इसका मतलब यह है कि सम्मेलन द्वारा कुछ एपीआई विफलता को इंगित करने के लिए 0 लौटते हैं, अन्य लोग -1 लौटते हैं। एक एपीआई के लिए जो -1 देता है, इसका मतलब यह नहीं है कि 0 कभी वैध संभाल होगा, केवल एपीआई विफलता को इंगित करने के लिए -1 देता है।

तो यह वास्तव में उस मान के बारे में है जिसका उपयोग आमतौर पर विफलता को इंगित करने के लिए एक एपीआई द्वारा किया जाता है; यह किसी भी अन्य हैंडल मान मान्य नहीं है या नहीं, किसी भी दिए गए सेट के लिए यह कुछ भी नहीं कहता है।

+0

ठीक है, लेकिन फिर कैसे 'SafeHandleZeroIsInvalid' कक्षा नहीं है? निश्चित रूप से एक * बहुत * अधिक एपीआई हैं जो शून्य के बजाय शून्य को अमान्य मान के रूप में वापस कर देते हैं? – Mehrdad

+1

मुख्य मुद्दा यह है कि एक ही हैंडल क्लास को * दोनों प्रकार के एपीआई के साथ काम करने की आवश्यकता है। इस मामले में "शून्य * या * माइनस वन" का अर्थ है * दोनों * को अमान्य माना जाता है - नहीं * या तो/या *। यह CreateMutex (विफलता पर NULL लौटाता है) के साथ CreateFile API (विफलता पर INVALID_HANDLE_VALUE लौटाता है) के साथ समान बेस क्लास का उपयोग करने की अनुमति देता है। दो अलग-अलग आधार वर्ग क्यों हैं (जो उपयोगकर्ता गलत होने पर भ्रम और त्रुटि का कारण बन सकता है) जब कोई दोनों मामलों को संभाल सकता है? – BrendanMcK

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