2009-10-16 7 views
8

कुछ आईडीएल में मैंने काम किया है, मैंने देखा है कि विधियों में वापसी मानों को चिह्नित करने के लिए 2 सम्मेलन हैं - [in, out] और [out, retval]COM आईडीएल परिभाषाओं में [इन, आउट] और [आउट, रिटावल] के बीच मतभेद

ऐसा लगता है कि [in, out] उदाहरण के लिए, जब वहाँ कई वापसी मान हैं प्रयोग किया जाता है:

HRESULT MyMethod(
    [in] long InputParam, 
    [in, out] long* OutputParam1, 
    [in, out] long* OutputParam2 
); 

ऐसा लगता है कि जब वहाँ केवल एक ही वापसी मान है [out, retval] प्रयोग किया जाता है, उदाहरण के लिए:

HRESULT MyMethod2(
    [in] long InputParam, 
    [out, retval] long* OutputParam1 
); 

क्या यह एक COM आईडीएल सम्मेलन है या कोड के साथ बस एक सम्मेलन है जिसके साथ मैं काम कर रहा हूं?

क्या कोड में कोई कार्यात्मक अंतर है जो 2 नोटेशन से उत्पन्न होगा, या वे पूरी तरह से अदलाबदल योग्य हैं?

उत्तर

23

[in, out] का अर्थ है कि जब विधि को कॉल किया जाता है तो वैध मान पास होता है और जब विधि सफलता प्राप्त होती है तो वैध मान होता है (जहां सूचक बिंदु)। [out] का अर्थ है कि जिस विधि को विधि कहा जाता है, वह हो सकता है लेकिन यह विधि मान्य होगी जब विधि सफलता प्राप्त करेगी। [out] और [in, out] पैरामीटर दोनों पॉइंटर्स होना चाहिए - उनके मान अपरिवर्तित और मान्य हैं और वैधता आवश्यकताएं केवल वे चर के लिए लागू होती हैं जिन्हें वे इंगित करते हैं।

[out, retval] यह संकेत देने के लिए एक वाक्य रचनात्मक चीनी है कि मूल COM समर्थन रैपर बनाने के दौरान यह बहुत पैरामीटर वापसी मूल्य में परिवर्तित किया जाना चाहिए। उदाहरण के लिए

HRESULT MyMethod([out] long* OutParam1, [out, retval] long* OutParam2); 

long IWrappedInterface::MyMethod(long* OutParam1); 

हो जाता है तो आप इसे [retval] चिह्नित नहीं करते हैं आवरण मूल हस्ताक्षर के साथ एक विधि में शामिल होंगे:

HRESULT IWrappedInterface::MyMethod(long* OutParam1, long* OutParam2); 

केवल पिछले एक [out] पैरामीटर कर सकते हैं [out, retval] के रूप में चिह्नित किया जाना चाहिए। [in, out] पैरामीटर [retval] के रूप में चिह्नित नहीं किया जा सकता है।

+0

उपयोगी स्पष्टीकरण के लिए धन्यवाद। – LeopardSkinPillBoxHat

+0

मैं यह जोड़ना चाहता हूं कि '[इन, आउट]' को सभी भाषाओं द्वारा सही ढंग से संभाला नहीं जा सकता है (अधिक विशेष रूप से, पुराना स्कूल विजुअल बेसिक, .NET के बारे में निश्चित नहीं है)। –

+0

मुझे आश्चर्य है कि [आउट, रिटावल] COM इंटरफेस को परिभाषित करने के लिए सर्वोत्तम अभ्यास के खिलाफ है क्योंकि निष्पादन विफल होने पर त्रुटि कोड (HRESULT) प्राप्त करने का कोई तरीका नहीं है? – dave

0

एक और अंतर यह है कि यह .NET कोड में पीआईए में कैसे दिखाई देगा।

[आउट, रेट] .NET में वापसी मान के रूप में दिखाई देगा।

[आउट] .NET में विधि पर एक तर्क दिखाएगा।

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