2013-02-11 54 views
6

मेरे पास वीसी ++ में इसके सी ++ इंटरफ़ेस के साथ एक तृतीय पक्ष COM घटक है। मुझे नीचे दिए गए कॉल में एक क्रैश हो रहा है जो मेरे आवेदन को दुर्घटनाग्रस्त कर रहा है। मैं इस फ़ंक्शन से कृपा से कैसे ठीक हो सकता हूं जो वास्तव में मेरे आवेदन का हिस्सा नहीं है?COM त्रुटि से कैसे ठीक से पुनर्प्राप्त करें?

inline _RecordsetPtr IGLibMgr::GetLibInfo (_bstr_t LibPath) { 
    struct _Recordset * _result = 0; 
    HRESULT _hr = raw_GetLibInfo(LibPath, &_result); 
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); 
    return _RecordsetPtr(_result, false); 
} 

यह अंतिम पंक्ति में दुर्घटनाग्रस्त हो जाता है। मुझे नहीं लगता कि मैं इस कोड को संशोधित कर सकता हूं क्योंकि यह तीसरी पार्टी COM सामान है। मेरे पास वास्तव में कौन से विकल्प हैं? मैं सिर्फ उपयोगकर्ता को संदेश बॉक्स लाना चाहता हूं और शानदार तरीके से लौटना चाहता हूं।

+1

क्या आप * निश्चित * हैं कि यह "क्रैशिंग" नहीं है क्योंकि आप '_com_error 'को पकड़ नहीं रहे हैं और जिसे' FAILED (_hr) 'स्थिति के कारण फेंक दिया जा रहा है? यदि आपने इसे डीबग किया है तो मैं * लगभग * गारंटी देता हूं कि जेनरेट किए गए अपर्याप्तता में थोड़ा सा जलाया जाता है (वह चीज़ जो 'FAILED() 'को गैर-शून्य तक पहुंचने का कारण बनती है) – WhozCraig

+0

मैं COM से परिचित नहीं हूं, क्या मुझे पकड़ने की ज़रूरत है यह पकड़() ब्लॉक के साथ? – zar

+0

हां। सामान्य नियम यह है कि, यदि कोई अपवाद फेंक दिया जा सकता है, तो आपको इसे पकड़ने और इसे संभालने की ज़रूरत है, या *** पता है कि आपका कॉलर ऐसा करेगा। ऐसा लगता है जैसे न तो किया जा रहा है। एमएसवीसी से 'comutil' समर्थन परत काफी मजबूत है; अपने आप में लगभग एक पद्धति। मैंने एक नमूना शामिल किया है कि आप इसे नीचे कैसे संभाल सकते हैं। – WhozCraig

उत्तर

5

आप पहले से ही अपने कोड में यह कर नहीं कर रहे हैं, तो आप फोन करने वाले की ओर से होने की जरूरत है:

try 
{ // setup your invoke for your object... 
    IGLibMgrPtr spMgr = .... 
    bstr_t bstrPath = .... 

    // invoke your call. 
    _RecordsetPtr spRS = spMgr->GetLibInfo(bstrPath); 

    ... continue normal processing ... 
} 
catch(const _com_error& ce) 
{ 
    // handle your error here. 
} 

यह कई स्तरों पर महत्वपूर्ण है। सबसे स्पष्ट यह है कि न केवल IGLibMgr सदस्य अपवाद फेंक सकता है, इसलिए bstr_t आवंटन आदि हो सकता है। COM DLL से #import कोड का उपयोग करते समय, एमएसवीसी की कॉम्यूटिल लाइब्रेरी से उत्पन्न स्मार्ट-पॉइंटर्स का उपयोग करते समय इस प्रारूप में उपयोग करें।

नोट: _com_error वर्ग प्राप्त क्यों त्रुटि हो गई, HRESULT, त्रुटि विवरण स्ट्रिंग, आदि के रूप में अगर यह तो अच्छा है यह भी IErrorInfo त्रुटि लौटने वस्तु द्वारा बनाई तक पहुँच प्रदान करता सहित कई सदस्यों को प्रदान करता है विस्तार के उस स्तर को प्रदान करने के लिए।

+0

कॉन्स के साथ बेहतर पकड़: 'पकड़ो (const _com_error & ex) {...}' – nogard

+0

@nogard egads मेरे पास काम पर कम से कम एक परियोजना में कोड की एक लाख लाइनों के आसपास है, मुझे इसके साथ ऐसा करने की ज़रूरत है, अब आप इसका जिक्र करते हैं यह। = P – WhozCraig