- •Изучение способов разработКи простейших com-объектов в среде delphi.
- •5.6 Методические указания.
- •5.6.1 Основные сведения о сом-объектах
- •5.6.2 Составляющие com-приложений
- •5.6.2.1 Способы взаимодействия com-клиентов с com-серверами
- •5.6.2.2 Регистрация com-сервера
- •5 .6.2.3 Библиотека com
- •1.6.2.4 Hresult.
- •5.6.2.5 Библиотека типов.
- •5.6.2.6 Общие сведения о com-клиентах
- •5.6.3 Объекты com в среде Delphi.
- •5.6.3.1 Средства реализации интерфейсов в среде Delphi.
- •5.6.3.2 Классы TcomObj, Coclass и tTypedComObject.
- •5.6.3.3 Пример простейшего приложения с применением интерфейсов.
- •ShowMessage(MyInterface.GetName);
- •5.6.4 Разработка структуры клиентского и серверного приложений.
- •5.6.5 Создание внутреннего сервера сом.
- •5.6.5.1 Создание динамической библиотеки.
- •5.6.5.2 Создание объекта сом.
- •5.6.5.3 Создание интерфейсов объекта сом.
- •5.6.5.4 Задание кода методов интерфейса.
- •5.6.6 Разработка клиентского приложения для внутреннего сервера
1.6.2.4 Hresult.
д
ля
сообщений о результатах работы, компоненты
СОМ используют значение HRESULT. Его
возвращают большинство функций
интерфейсов СОМ, и. в том числе -
QueryInterface. HRESULT представляет собой
32-разрядное значение, разделенное на
три поля (рис. 5.
). Название возникло по историческим
причинам: оно просто расшифровывается
как "вот результат" (here's the result), a
не "описатель результата" (handle of
result).
Определенные системой значения HRESULT содержатся в заголовочном файле Win32 WINERROR.H. В начале файла расположены коды ошибок Win32, так что его нужно пролистать, чтобы добраться до HRESULT. HRESULT похож на код ошибки Win32, но это не одно и то же, и смешивать их не следует.
Старший бит HRESULT, как показано на рис. 5. , отмечает, успешно или нет выполнена функция. Это позволяет определить много кодов возврата и для успеха, и для неудачи. Последние 16 битов содержат собственно код возврата. Остальные 15 битов содержат дополнительную информацию о типе и источнике кода ошибки. В табл. 5. приведены наиболее часто используемые коды. По соглашению в названиях успешных кодов возврата содержится S_, а в названиях кодов ошибок - Е_.
Обратите внимание, что значение S_FALSE равно 1, а значение S_OK - 0. Это противоречит обычной практике программирования на C/C++, где 0 - это ложь, а не-0 - истина. Поэтому при использовании HRESULT обязательно явное сравнение кодов возврата с S_FALSE или S_OK.
Пятнадцать битов - с 30-го по 16-й - содержат идентификатор средства (facility). Он указывает, какая часть операционной системы выдает данный код возврата. Поскольку операционную систему разрабатывает Microsoft, она зарезервировала право определения идентификаторов средств за собой. Идентификаторы средств, определенные в настоящее время, приведены в табл. 5. .
Распространенные значения HRESULT
Таблица 5.
Название |
Значение |
S_OK |
Функция отработала успешно. В некоторых случаях этот код также означает, что функция возвращает логическую истину. Значение S_OK равно 0. |
NOERROR |
То же, что S_ОК. |
S_FALSE |
Функция отработала успешно и возвращает логическую ложь. Значение S_FALSE равно 1. |
E_UNEXPECTED |
Неожиданная ошибка. |
E_NOTIMPL |
Функция-член не реализована. |
E_NOINTERFACE |
Компонент не поддерживает запрашиваемый интерфейс. Возвращается Query Interface. |
E_OUTOFMEMORY |
Компонент не может выделить требуемый объем памяти. |
E_FAIL |
Ошибка по неуказанной причине. |
И
дентификатор
средства освобождает, например,
разработчиков Microsoft,
занятых RPC
(FACILITY_RPC),
от необходимости согласовывать значения
кодов возврата с теми, кто работает над
управляющими элементами ActiveX
(FACILITY_CONTROL).
Поскольку группы разработчиков используют
разные идентификаторы средств, коды
возврата разных средств не будут
конфликтовать. Разработчикам
специализированных интерфейсов повезло
меньше.
Все идентификаторы средств, кроме FACILITY_ITF, задают определенные СОМ универсальные коды возврата. Эти коды всегда и везде одни и те же. FACILITY_ITF - исключение; ему отвечают коды, специфичные для данного интерфейса. Чтобы определить средство для данного HRESULT, необходимо использовать макрос HRESULT_FACILITY, определенный в WINERROR.H. Коды же FACILITY_ITF не уникальны и могут иметь разные значения, в зависимости от интерфейса, возвратившего код.
