Как получить код ошибки CDO.Message

Я написал свои процедуры для использования CDO.Message. Давно работает. Но сейчас на каком-то сайте установили сертификат и тогда ранее рабочая версия выдает ошибки при всех звонках.

Я использовал простые варианты для хранения COM-объекта CDO.Message.

Когда я использовал метод Send(?), он возвращает HResult. Но это интересно, потому что HResult непригоден для получения кода ошибки, потому что Send кажется реальным методом, который создает исключение при проблемах. Таким образом, код результата равен -1, если я установил это значение раньше.

Я попытался получить последний код ошибки с помощью GetLastError. Но это 0.

Я могу поймать исключение, но оно содержит только сообщение об ошибке:

"Транспорту не удалось подключиться к серверу"

Коды VB могут получить код ошибки, который может предоставить дополнительную информацию о проблеме (или нет).

Знаете ли вы о методе получения значения кода ошибки из Delphi XE3?


person durumdara    schedule 30.10.2013    source источник


Ответы (1)


Было бы лучше, если бы у нас был исходный код. В частности, объявление Delphi интерфейса COM.

Я предполагаю, что метод объявлен как safecall. Это означает, что компилятор понимает, что метод на самом деле stdcall возвращает HRESULT, и переписывает параметры для соответствия. Если истинный метод COM возвращает HRESULT, отличный от S_OK, компилятор пишет код для проверки этого и преобразования ошибки в исключение.

Возникающее исключение будет EOleSysError со свойством ErrorCode, которое содержит искомое HRESULT.

Итак, вам необходимо:

  • Добавьте обработчик исключений для перехвата EOleSysError.
  • Прочитайте свойство ErrorCode экземпляра исключения EOleSysError, которое вы перехватываете.

Это все немного вокруг домов. Если вы предпочитаете избегать обработки исключений, вы всегда можете переписать объявление COM-интерфейса, чтобы оно было истинным методом stdcall, возвращающим HRESULT.

person David Heffernan    schedule 30.10.2013