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.
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
Po prostu nie znam COM, czy muszę złapać to z blokiem catch()? – zar
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