(प्रारंभिक ध्यान दें: मैं अभी तक नहीं कर रहा हूँ पूरी तरह से पूरे 'इंटरॉप' बात के साथ तेज़ी से काम करने ...) एक अपवाद में लपेटा जाता हैकॉम `HRESULT` .NET में
के भीतर से एक COM पुस्तकालय का उपयोग करते समय .NET, सभी HRESULT
विधियों को उस चीज में लपेटा जाता है जो रिटर्न कोड सफल नहीं होने पर फेंकता है।
//ATL magic exluded
class C {
HRESULT foo(){ return E_FAIL; }
};
// usage code:
if(SUCCEEDED(c.foo())) {
// success code
} else {
// failure code
}
इस कोड के नेट समकक्ष पढ़ता है:
try {
c.foo();
// success code
} catch (Exception e) {
// failure code
}
वहाँ .NET में सीधे कॉम वापसी कोड पहुंचने का एक तरीका है, ताकि कोई अपवाद संचालन की आवश्यकता है?
मैं बस अधिक स्पष्ट रूप से इंगित करना चाहता था कि '[PreserveSig]' वह विशेषता है जिसका उपयोग यह कहने के लिए किया जाता है कि क्या आप HRESULTS को अपवादों में परिवर्तित करना चाहते हैं या नहीं। यह भी ध्यान दिया जाना चाहिए कि आप आम तौर पर * चाहते हैं * अपवादों का उपयोग करना चाहते हैं। HRESULTS केवल मौजूद है क्योंकि सभी भाषाएं अपवादों को समान तरीके से संभालती नहीं हैं, इसलिए उन्हें अपवादों की रिपोर्ट करने के लिए एक अपवाद-आधारित तंत्र की आवश्यकता होती है। एक बार जब आप अपनी भाषा के अंदर हों तो HRESULT को (आदर्श) अपनी भाषा के मूल अपवाद तंत्र में परिवर्तित किया जाना चाहिए। –
यही कारण नहीं है कि आप '[PreserveSig]' का उपयोग क्यों करना चाहते हैं। कुछ COM इंटरफेस हैं जो बेहतर या बदतर HRESULT को बुलियन के रूप में उपयोग करते हैं; ये फ़ंक्शन या तो S_OK, S_FALSE या त्रुटि मान लौटा सकते हैं। यदि आप '[PreserveSig] 'का उपयोग नहीं करते हैं, तो यह जानने का कोई तरीका नहीं है कि यह S_OK या S_FALSE लौटा है या नहीं। यह सिर्फ S_FALSE के लिए नहीं है, लेकिन किसी भी गैर-त्रुटि HRESULT के लिए। COM कक्षाएं जो यह सौभाग्य से दुर्लभ हैं, लेकिन वे मौजूद हैं। – Sven
बहुत अजीब 'IProgressDialog.HasUserCancelled' विधि भी है जो 'HRESULT' (बाकी इंटरफ़ेस के तरीकों के रूप में) वापस नहीं लौटाती है, बल्कि इसके बजाय' BOOL' लौटाती है। (विंडोज 95 में मूल इंटरफ़ेस में लगभग निश्चित रूप से एक बग, और अब संगतता के लिए जमे हुए है) –