2013-02-11 9 views
6

Mam komponent COM innej firmy z interfejsem C++ w VC++. W poniższym wywołaniu pojawia się awaria, która powoduje awarię mojej aplikacji. Jak mogę z wdziękiem odzyskać tę funkcję, która nie jest częścią mojego wniosku?Jak z pełnym wdziękiem odzyskać od błędu 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); 
} 

Zawiesza się w ostatniej linii. Nie sądzę, żebym mógł zmodyfikować ten kod, ponieważ jest to materiał COM innej firmy. Jakie mam naprawdę opcje? Chcę tylko wyświetlić okno komunikatu użytkownikowi i wrócić z wdziękiem.

+1

Czy jesteś pewien, że to nie jest "upaść", ponieważ nie łapiesz '_com_error &', który jest rzucany ze względu na status 'FAILED (_hr)'? Jeśli debugowałeś to, prawie * gwarantowałbym, że generowany hresult ma zapalony bit SEVERITY (rzecz, która powoduje, że 'FAILED()' do eval na niezerowe) – WhozCraig

+0

Po prostu nie znam COM, czy muszę złapać to z blokiem catch()? – zar

+0

Tak. Ogólna reguła jest taka, że ​​jeśli można rzucić wyjątek, musisz go złapać i obsłużyć, lub *** wiedzieć, że twój rozmówca to zrobi. Wygląda na to, że żadne z nich się nie kończy. Warstwa "comutil" z MSVC jest dość silna; prawie sama metodologia. Poniżej znajduje się przykład tego, jak sobie z tym poradzić. – WhozCraig

Odpowiedz

5

Jeśli nie jesteś już robi to w kodzie, trzeba być z boku wywołującego:

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

Jest to ważne na wielu poziomach. Najbardziej oczywistą rzeczą jest to, że nie tylko twój członek może rzucić wyjątek, tak samo jak przydział bstr_t, itp. Kiedy używasz kodu #import z biblioteki DLL COM, przyzwyczajaj się do tego formatu, jeśli używasz wygenerowanych inteligentnych wskaźników z biblioteki comutil MSVC.

Uwaga: Klasa _com_error dostarcza kilku członków do uzyskania dlaczego błąd wydarzyło, w tym opis błędu HRESULT, łańcuch, itp nawet zapewnia dostęp do IErrorInfo utworzonego przez obiekt błędów powrocie, jeśli jest tak ładny jak aby zapewnić taki poziom szczegółowości.

+0

Lepsze haczyki z const: 'catch (const _com_error & ex) {...}' – nogard

+0

@nogard egads Mam ponad milion linii kodu w co najmniej jednym projekcie w pracy Muszę to zrobić z tym, że teraz wspomniałeś to. = P – WhozCraig

Powiązane problemy