На этом шаге мы рассмотрим особенности доступа клиентских приложений к кодам HRESULT.
Многие клиентские приложения не способны даже получить коды HRESULT, возвращаемые методом сервера. Таким образом, созданные коды часто становятся ненужными. А виноваты в этом ограничения, присущие интерфейсу IDispatch.
Причина этого - класс-оболочка, который Visual C++ создает для того, чтобы взаимодействоваь с компонентом посредством интерфейса IDispatch, а не вызывать его методы напрямую через таблицу vtable. Соединяясь с сервером такими окольными путями, объект IDispatch теряет возвращаемые методами значения, и они никогда не достигают клиентского приложения, которое узнает об ошибке только по исключению, возбужденному в результате получения отрицательного кода HRESULT от вызывавшего метода. Звключив код, обращающийся к серверу, в блоки try/catch, приложение получает возможность реагировать на ошибки, однако точную их причину определить не сумеет.
Не лучше остоят дела и в Microsoft Visual Basic. Точно так же, приложения, написанные с его использованием, не способны получить значение HRESULT, а могут только реагировать на отрицательные коды ошибок - посредством оператора On Error.
В заключение следует отметить, что некоторые клиентские приложения, написанные на C++, все же получают коды HRESULT. Независимо от того, применяет программа MFC или нет, она не обязана полагаться на интерфейс IDispatch, поэтому она может получать возвращаемые сервером коды, обходя создаваемый Visual C++ класс-оболочку.
На следующем шаге мы рассмотрим событие Error.