2009-09-15 12 views
8

COM इंटरफेस विधियां अमान्य तर्क मानों को सिग्नल करने के लिए विभिन्न HRESULT मान वापस कर सकती हैं। मैं E_POINTER और E_INVALIDARG कब वापस करूँ?जब E_POINTER और E_INVALIDARG वापस आते हैं?

जैसा कि मैं समझता हूं कि किसी विधि को एक encapsulated संग्रह में एक अनुक्रमणिका प्राप्त होती है और यह E_INVALIDARG सीमा से बाहर है। यदि किसी विधि को Interface** पॉइंटर प्राप्त होता है जहां यह एक नव निर्मित ऑब्जेक्ट को पॉइंटर स्टोर करने के लिए होता है जो E_POINTER है।

HRESULT CImpl::GetItem(long index; Interface** result) 
{ 
    if(result == 0) { 
     return E_POINTER; 
    } 
    if(index < 0 || index >= internalArray.size()) { 
     return E_INVALIDARG; 
    } 
    *result = CreateWrapperObject(internalArray[index]); 
    return S_OK; 
} 

लेकिन क्या होगा अगर यह एक "में" पैरामीटर के रूप में एक फ़ाइल नाम के साथ एक WCHAR* बफर प्राप्त करता है और इस WCHAR* रिक्त है? क्या यह E_POINTER या E_INVALIDARG है?

या किसी विधि को कुछ संरचनाओं के लिए पॉइंटर प्राप्त होता है और उस सूचक के माध्यम से संरचना को भरने की उम्मीद है और यह सूचक शून्य है - क्या यह E_POINTER या E_INVALIDARG है?

HRESULT CImpl::SaveToFile(WCHAR* fileName) 
{ 
    if(fileName == 0) { 
     return // what to return here? 
    } 
    //... do actual work here 
} 

HRESULT CImpl::GetAttributes(Attributes* to) 
{ 
    if(to == 0) { 
     return // what to return here? 
    } 
    attributes->IsCool = getIsCool(); 
    attributes->Color = RGB(0, 255, 0); 
    return S_OK; 
} 

जब E_POINTER वापस जाने के लिए के लिए नियम और जब E_INVALIDARG जब जाँच सूचक प्रकार पैरामीटर क्या हैं?

उत्तर

9

आप E_POINTER लौटने जब एक बाहर पैरामीटर के सूचक के संदर्भ में नल है, यह एक त्रुटि कोड है कि कार्यक्रम में या इंटरॉप परत में एक बग को इंगित करता है मानते हैं।

आप E_INVALIDARG लौटते हैं जब पैरामीटर के साथ एक अनुप्रयोग स्तर होता है उदाहरण के लिए श्रेणी समस्या या पैरामीटर जो एक दूसरे के साथ टकराने के लिए होता है।

आपका मामले में, SaveToFile(...) में आप E_INVLIADARG लौटना चाहिए क्योंकि यह वैध खाली फ़ाइल नाम पारित करने के लिए नहीं है, और GetAttributes(...) में आप E_POINTER लौटना चाहिए (अगर यह एक बाहर परम है) क्योंकि आप मूल्य नहीं भर सकते।

और हाँ, हम सब एल-ओ-वी-ई कॉम :)

+0

आप किसी भी दस्तावेज़ संदर्भ है? – Constantin

+0

सहमत हुए। मैं वास्तव में इसके लिए एक एमएसडीएन संदर्भ देखना चाहता हूं। उपर्युक्त कुछ प्रकार की समझ में आता है, लेकिन कैननिकल संक्रमण होना अच्छा होगा। –

+0

मुझे यकीन नहीं है कि यह उत्तर सही है। उदाहरण के लिए, VS2010 ' 'में,' AtlSetChildSite()' कार्यान्वयन में, 'p_PChin' पैरामीटर 'पैरामीटर' पैरामीटर वापस किया जाता है, इसके बजाय इस उत्तर के अनुसार (यदि मैं इसे सही ढंग से समझ गया हूं), 'E_INVALIDARG 'उस मामले में वापस किया जाना चाहिए था। मुझे लगता है कि एटीएल अच्छा COM प्रोग्रामिंग प्रथाओं का एक अच्छा स्रोत है, इसलिए शायद 'E_POINTER' को अमान्य (उदा।' NULL') पॉइंटर्स के सामान्य मामलों में वापस किया जाना चाहिए। लेकिन स्पष्ट रूप से मुझे यकीन नहीं है, और मैं सहमत हूं कि कुछ एमएसडीएन आधिकारिक संदर्भ अच्छा होगा। –

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