Как обрабатывать HRESULT в надстройке Outlook?

На основе этого ответа SO: Выявление кода ошибки, специфичного для COMException, I ' Я хочу знать, чтобы правильно обрабатывать COMExceptions в операционных системах и в нескольких версиях OL, если мне нужно посмотреть только на определенную часть исключения. Например,

private const uint HRESULT_OPERATIONABORTED = 0x80004004;

// ...

    try {
        // something that could throw COMExceptions
    } catch (System.Runtime.InteropServices.COMException e) {

        switch ((uint)e.ErrorCode) {

            case HRESULT_OPERATIONABORTED:
                break;

            default:
                break;
        }
    }

Достаточно ли это кроссплатформенность или необходимо учитывать только часть кода ошибки?

РЕДАКТИРОВАТЬ - Чтобы уточнить, мой точный вопрос заключается в том, является ли сравнение (uint)e.ErrorCode с 0x80004004 слишком конкретным (то есть, всегда получаю ли я 0x80004004 для этой конкретной ошибки, независимо от OS / OL), или если это правильный способ делать что-то.


person wes    schedule 23.05.2011    source источник


Ответы (2)


Что касается кросс-платформенной совместимости, вам нечего опасаться, COM работает только в Windows. Точно так же четко определен код ошибки. Вы можете найти стандартные коды ошибок COM в заголовочном файле WinError.h SDK. Это E_ABORT. Я бы рекомендовал вам действительно использовать этот идентификатор.

Вы найдете этот заголовок в c: \ program files \ microsoft sdks \ windows \ v6.0 \ include. Это v7.0 для VS2010.

person Hans Passant    schedule 23.05.2011
comment
Я имел в виду только, скажем, XP и Win7. Спасибо за шапку, это именно то, что мне нужно. - person wes; 24.05.2011

Вы можете также рассмотреть возможность перехвата таких исключений, как System.OutOfMemoryException и других исключений, которые являются результатом HRESULT, возвращаемых COM-объектами. Не все неудачные значения HRESULT приводят к исключению COMException.

Для большинства ошибок MAPI, которые я видел, коды ошибок не отличаются от тех, что указаны в стандартных файлах заголовков C MAPI, поэтому я думаю, что оператор switch подойдет. Другими словами, этот метод не должен быть менее совместимым, чем клиентское приложение MAPI, написанное на языке C.

person Kevin Hsu    schedule 23.05.2011