2008-10-06 18 views
10

ISupportErrorInfo इंटरफ़ेस का क्या अर्थ है? मुझे समझने के लिए कुछ नुकसान हुआ है। MSDN से:ISupportErrorInfo का कार्यान्वयन - इसका क्या अर्थ है?

यह सुनिश्चित करता है कि इंटरफेस त्रुटि जानकारी सही ढंग से कॉल श्रृंखला को प्रचारित किया जा सकता है। स्वचालन ऑब्जेक्ट्स जो त्रुटि प्रबंधन इंटरफेस का उपयोग करते हैं ISupportErrorInfo लागू करना आवश्यक है।

यह विधि इंगित करती है कि एक इंटरफ़ेस IErrorInfo इंटरफ़ेस का समर्थन करता है या नहीं।

HRESULT InterfaceSupportsErrorInfo(
    REFIID riid 
); 

क्या यह InterfaceSupportsErrorInfo में S_OK वापस जाने के लिए क्या मतलब है? क्या आप सभी इंटरफेस के लिए S_OK वापस कर सकते हैं? बस कुछ?

उत्तर

17

यह (कुछ संबंधित MSDN पृष्ठों के आधार पर) की मेरी समझ है कि ISupportErrorInfo को लागू करने से, आप संकेत कर रहे हैं कि अपने वर्ग पर एक या अधिक इंटरफेस SetErrorInfo बुला, के रूप में सिर्फ एक विफलता HRESULT लौटने के लिए विरोध द्वारा त्रुटि जानकारी देता है।

इसके लिए ISuportErrorInfo::InterfaceSupportsErrorInfo अपने क्रियान्वयन केवल अपनी कक्षा पर उन इंटरफेस है कि वास्तव में SetErrorInfo का उपयोग करने के लिए फोन करने वाले त्रुटि जानकारी के लिए वापस जाने के लिए S_OK लौटना चाहिए, और केवल उन इंटरफेस।

उदाहरण के लिए, कहें कि आपके पास एक कक्षा है जो आपके द्वारा लिखे गए इंटरफ़ेस को लागू करती है जिसे IFoo कहा जाता है जिसमें DoSomething विधि है। किसी और अपने वर्ग का एक उदाहरण बनाता है और कहता है IFoo::DoSomething हैं, वे निम्नलिखित अगर DoSomething एक विफलता HRESULT रिटर्न क्या करना चाहिए रहे हैं (विभिन्न MSDN पन्नों से टीका है, लेकिन मैं यहाँ से शुरू कर दिया: http://msdn.microsoft.com/en-us/library/ms221510.aspx):

  • कॉल QueryInterfaceIFoo सूचक पर वस्तु के लिए ISupportErrorInfo इंटरफ़ेस IFoo

  • लागू कर रहा है प्राप्त करने के लिए कहा जाता है वस्तु ISupportErrorInfo, लागू नहीं है तो फोन करने वालेहोगा HRESULT मान के आधार पर त्रुटि को संभालने के लिए, या इसे कॉल स्टैक पास करें।

  • बुलाया वस्तु ISupportErrorInfo को लागू करता है, तो फोन करने वाले ISupportErrorInfo::InterfaceSupportsErrorInfo बुलाना चाहिए, इंटरफ़ेस है कि त्रुटि दी के लिए एक REFIID में गुजर। इस मामले में, DoSomethingIFoo इंटरफ़ेस की विधि ने एक त्रुटि लौटा दी है, इसलिए आप REFIID_IFoo (इसे परिभाषित मानते हुए) InterfaceSupportsErrorInfo पर पास करेंगे।

  • InterfaceSupportsErrorInfo रिटर्न S_OK, तो फोन करने वाले इस बात है कि यह GetErrorInfo फोन करके त्रुटि के बारे में अधिक विस्तृत जानकारी प्राप्त कर सकते हैं में जानता है।यदि InterfaceSupportsErrorInfoS_FALSE लौटाता है, तो कॉलर मान सकता है कि कॉल किया गया इंटरफ़ेस विस्तृत त्रुटि जानकारी प्रदान नहीं करता है, और यह पता लगाने के लिए वापस आने वाले HRESULT पर भरोसा करना होगा।

कारण यह कुछ भ्रामक/जटिल त्रुटि हैंडलिंग एपीआई के लिए लचीलेपन के लिए हो रहा है (जहाँ तक मैं के रूप में मैं वैसे भी बता सकते हैं यह कॉम सब के बाद है,।)। इस डिज़ाइन के साथ, एक क्लास कई इंटरफेस का समर्थन कर सकती है, लेकिन इसके तरीकों से त्रुटि जानकारी वापस करने के लिए प्रत्येक इंटरफ़ेस को SetErrorInfo का उपयोग करने की आवश्यकता नहीं है। आप निश्चित कर सकते हैं, SetErrorInfo के माध्यम से अपनी कक्षा में विस्तृत त्रुटि जानकारी पर इंटरफेस का चयन करें, जबकि अन्य इंटरफेस सामान्य HRESULT एस त्रुटियों को इंगित करने के लिए जारी रख सकते हैं।

सारांश में, ISupportErrorInfo इंटरफ़ेस एक तरह से बुला कोड है कि इंटरफेस की कम से कम एक अपने वर्ग के औजार विस्तृत त्रुटि जानकारी लौट सकते हैं सूचित करने के लिए है, और InterfaceSupportsErrorInfo प्रणाली कॉलर बताता है कि कोई इंटरफ़ेस उन इंटरफेस में से एक है । यदि ऐसा है, तो कॉलर GetErrorInfo पर कॉल करके विस्तृत त्रुटि जानकारी पुनर्प्राप्त कर सकता है।

+0

"यदि कॉल किया गया ऑब्जेक्ट ISupportErrorInfo को कार्यान्वित करता है, तो कॉलर को ISUPportErrorInfo के लिए QueryInterface माना जाता है" यह शायद एक त्रुटि है, क्योंकि कॉलर बस यह निर्धारित करने के लिए पहले कॉल करता है कि यह इंटरफ़ेस पहले स्थान पर समर्थित है या नहीं? कॉलर को तब दूसरी बार क्यूआई कॉल किए बिना 'ISupportErrorInfo :: InterfaceSupportsErrorInfo' पर कॉल करना चाहिए? –

+0

@FelixDombek मैं सहमत हूं। मैंने अनावश्यक 'क्वेरी इंटरफेस' कॉल को हटाने के लिए पोस्ट संपादित किया। –

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