यह (कुछ संबंधित 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):
कॉल QueryInterface
IFoo
सूचक पर वस्तु के लिए ISupportErrorInfo
इंटरफ़ेस IFoo
लागू कर रहा है प्राप्त करने के लिए कहा जाता है वस्तु ISupportErrorInfo
, लागू नहीं है तो फोन करने वालेहोगा HRESULT
मान के आधार पर त्रुटि को संभालने के लिए, या इसे कॉल स्टैक पास करें।
बुलाया वस्तु ISupportErrorInfo
को लागू करता है, तो फोन करने वाले ISupportErrorInfo::InterfaceSupportsErrorInfo
बुलाना चाहिए, इंटरफ़ेस है कि त्रुटि दी के लिए एक REFIID
में गुजर। इस मामले में, DoSomething
IFoo
इंटरफ़ेस की विधि ने एक त्रुटि लौटा दी है, इसलिए आप REFIID_IFoo
(इसे परिभाषित मानते हुए) InterfaceSupportsErrorInfo
पर पास करेंगे।
InterfaceSupportsErrorInfo
रिटर्न S_OK
, तो फोन करने वाले इस बात है कि यह GetErrorInfo
फोन करके त्रुटि के बारे में अधिक विस्तृत जानकारी प्राप्त कर सकते हैं में जानता है।यदि InterfaceSupportsErrorInfo
S_FALSE
लौटाता है, तो कॉलर मान सकता है कि कॉल किया गया इंटरफ़ेस विस्तृत त्रुटि जानकारी प्रदान नहीं करता है, और यह पता लगाने के लिए वापस आने वाले HRESULT पर भरोसा करना होगा।
कारण यह कुछ भ्रामक/जटिल त्रुटि हैंडलिंग एपीआई के लिए लचीलेपन के लिए हो रहा है (जहाँ तक मैं के रूप में मैं वैसे भी बता सकते हैं यह कॉम सब के बाद है,।)। इस डिज़ाइन के साथ, एक क्लास कई इंटरफेस का समर्थन कर सकती है, लेकिन इसके तरीकों से त्रुटि जानकारी वापस करने के लिए प्रत्येक इंटरफ़ेस को SetErrorInfo
का उपयोग करने की आवश्यकता नहीं है। आप निश्चित कर सकते हैं, SetErrorInfo
के माध्यम से अपनी कक्षा में विस्तृत त्रुटि जानकारी पर इंटरफेस का चयन करें, जबकि अन्य इंटरफेस सामान्य HRESULT
एस त्रुटियों को इंगित करने के लिए जारी रख सकते हैं।
सारांश में, ISupportErrorInfo
इंटरफ़ेस एक तरह से बुला कोड है कि इंटरफेस की कम से कम एक अपने वर्ग के औजार विस्तृत त्रुटि जानकारी लौट सकते हैं सूचित करने के लिए है, और InterfaceSupportsErrorInfo
प्रणाली कॉलर बताता है कि कोई इंटरफ़ेस उन इंटरफेस में से एक है । यदि ऐसा है, तो कॉलर GetErrorInfo
पर कॉल करके विस्तृत त्रुटि जानकारी पुनर्प्राप्त कर सकता है।
स्रोत
2008-10-06 04:40:21
"यदि कॉल किया गया ऑब्जेक्ट ISupportErrorInfo को कार्यान्वित करता है, तो कॉलर को ISUPportErrorInfo के लिए QueryInterface माना जाता है" यह शायद एक त्रुटि है, क्योंकि कॉलर बस यह निर्धारित करने के लिए पहले कॉल करता है कि यह इंटरफ़ेस पहले स्थान पर समर्थित है या नहीं? कॉलर को तब दूसरी बार क्यूआई कॉल किए बिना 'ISupportErrorInfo :: InterfaceSupportsErrorInfo' पर कॉल करना चाहिए? –
@FelixDombek मैं सहमत हूं। मैंने अनावश्यक 'क्वेरी इंटरफेस' कॉल को हटाने के लिए पोस्ट संपादित किया। –