Как работать с HRESULT в надстройке Outlook? - PullRequest
2 голосов
/ 24 мая 2011

Основываясь на этом SO-ответе: Перехват специфичного для COMException кода ошибки , я хотел бы знать, чтобы правильно обрабатывать COMException для разных ОС и нескольких версий 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), или если это правильный способ делать вещи.

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

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

Этот заголовок находится в каталоге c: \ program files \ microsoft sdks \ windows \ v6.0 \ include. Это v7.0 для VS2010.

0 голосов
/ 24 мая 2011

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

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

...