2013-02-11 4 views
6

Ich habe eine COM-Komponente von Drittanbietern mit seiner C++ - Schnittstelle in VC++. Ich stürze mich in den folgenden Anruf, der meine Anwendung stürzt. Wie kann ich von dieser Funktion, die nicht wirklich Teil meiner Anwendung ist, ordnungsgemäß wiederherstellen?Wie von COM-Fehler ordnungsgemäß wiederherstellen?

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); 
} 

Es stürzt in der letzten Zeile ab. Ich glaube nicht, dass ich diesen Code ändern kann, da es COM-Sachen von Drittanbietern sind. Welche Möglichkeiten habe ich wirklich? Ich will nur Nachricht Box zum Benutzer und zurückkommen würde anmutig.

+1

Bist du * sicher * es ist nicht "abstürzt", weil du keinen '_com_error &' fällst, der wegen eines 'FAILED (_hr)' Status geworfen wird? Wenn Sie dies debuggten, würde ich * fast * garantieren, dass das erzeugte Ergebnis das SEERITY-Bit hat (das Ding, das bewirkt, dass FAILED() 'nicht auf Null auswertet) – WhozCraig

+0

Ich bin nur nicht vertraut mit COM, muss ich fangen es mit catch() blockieren? – zar

+0

Ja. Die allgemeine Regel ist, wenn eine Ausnahme ausgelöst werden kann, müssen Sie entweder fangen und behandeln, oder *** *** wissen, dass Ihr Anrufer dies tun wird. Es hört sich so an, als ob nichts getan wird. Die 'comutil'-Unterstützungsebene von MSVC ist ziemlich stark; fast eine eigene Methode. Ich habe ein Beispiel dafür, wie Sie damit umgehen können. – WhozCraig

Antwort

5

Wenn Sie dies nicht bereits in Ihrem Code zu tun, müssen Sie von der Anrufer-Seite sein:

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. 
} 

Diese auf mehreren Ebenen wichtig ist. Das offensichtlichste Wesen ist, dass nicht nur Ihr IGLibMgr Mitglied eine Ausnahme auslösen kann, sondern auch die bstr_t Zuteilung usw. Wenn Sie #import Code aus einer COM DLL verwenden, gewöhnen Sie sich an dieses Format, wenn Sie generierte Smartpointer aus der comutil Bibliothek von MSVC verwenden.

Hinweis: Die _com_error Klasse stellt mehrere Mitglieder für den Erhalt, warum der Fehler passiert ist, einschließlich dem HRESULT, Fehlerbeschreibung String, etc. Es bietet auch Zugriff auf die IErrorInfo durch das Fehler-Rückkehr-Objekt erstellt, wenn es so schön ist wie um diesen Detaillierungsgrad zu bieten.

+0

Besser fangen mit const: 'catch (const _com_error & ex) {...}' – nogard

+0

@nogard egads Ich habe über eine Million Zeilen Code in mindestens einem Projekt bei der Arbeit, die ich tun muss, jetzt, wo Sie erwähnen es. = P – WhozCraig

Verwandte Themen