Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КОП__подготовка.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
42 Кб
Скачать
☆
  1. Обработка ошибок в com. Hresult. Макросы succedeed() и fail().

HRESULT – большое число, которое позволяет однозначно идентифицировать различные ошибки в разных интерфейсах.

Структура HRESULT:

S(31)

Средства(30-16)

Код возврата (15-0)

Старший бит S определяет наличие ошибки. Если S=1, то ошибка есть, если S=0, то ошибки нет.

Все ошибки в COM-технологии возвращаются переменной, которая имеет тип HRESULT.

Для проверки значения используются специальные макросы.

Макросы называются:

SUCCEDEED() (hr) – успешное завершение.

FAIL (hr) – ошибочное завершение.

Заголовочный файл winerror.h содержит макросы, применяемые к HRESULT для проверки тех или иных кодов ошибки. Существуют следующие макросы для определения ошибок по значению HRESULT: S_OK, S_FALSE, NOERROR, E_FAIL, E_NOINTERFACE, E_OUTOFMEMORY и др.

В начало

  1. Хранение guid в реестре. Информация о классе, хранимая в реестре. Инициализация com-библиотеки в клиенте.

Информация о COM-сервере (компоненте) хранится в реестре, в ключе, идентифицируемом по GUID'у.

В реестре принято задавать GUID'ы для интерфейсов.

Подраздел реестра или ключ, содержащий описание COM-компонента подписывается его GUID'ом. Внутри подраздела содержатся записи о расположении и имени программного модуля, в котором реализован интерфейс, ProgID компонента, VersionIndependentProgID и др. Кроме того, реестр содержит перечень ключей ProgID, в которых содержится соответствующий им GUID. Таким образом, реестр позволяет вести учёт компонентов, интерфейсов, фабрик классов, библиотек типов.

Метод QueryInterface(), который возвращает ссылку на объект по GUID’у выполняет:

1)поиск подраздела COM-компонента в реестре по его GUID

2)считывает из ключа ProgID размещение программного модуля, реализующего этот компонент

3)запускает этот программный модуль

4)возвращает указатель на интерфейс созданного модуля

В начало

  1. Создание объектов при помощи функции CoCreateInstance(). Использование. Достоинства, недостатки.

Для создания компонента клиент должен вызвать функцию CoCreateInstance(). CoCreateInstance() создает фабрику класса и использует ее интерфейс IClassFactory для создания COM объекта. Интерфейс IClassFactory состоит из двух функций. Функция CreateInstance() создает запрашиваемый компонент. Функция LockServer() служит для удержания сервера в памяти до окончания работы с фабрикой класса.

В начало

  1. Фабрика классов. Интерфейс iClassFactory(). Методы этого интерфейса. Метод GetClassObject().

Фабрика класса - это COM объект, который служит для создания других объектов. Она нужна для того, чтобы иметь возможность контролировать процесс создания и инициализации COM объекта.

Для создания компонента клиент должен вызвать функцию CoCreateInstance(). CoCreateInstance() создает фабрику класса и использует ее интерфейс IClassFactory для создания COM объекта. Интерфейс IClassFactory состоит из двух функций. Функция CreateInstance() создает запрашиваемый компонент. Функция LockServer() служит для удержания сервера в памяти до окончания работы с фабрикой класса.

Для создания экземпляра фабрики класса предназначена функция библиотеки COM CoGetClassObject().

В начало

  1. Фабрика классов. Протокол использования фабрики классов с использованием интерфейса iClassFactory().

Фабрика класса - это COM объект, который служит для создания других объектов. Она нужна для того, чтобы иметь возможность контролировать процесс создания и инициализации COM объекта.

Для создания компонента клиент должен вызвать функцию CoCreateInstance(). CoCreateInstance() создает фабрику класса и использует ее интерфейс IClassFactory для создания COM объекта. Интерфейс IClassFactory состоит из двух функций. Функция CreateInstance() создает запрашиваемый компонент. Функция LockServer() служит для удержания сервера в памяти до окончания работы с фабрикой класса.

Для создания экземпляра фабрики класса предназначена функция библиотеки COM CoGetClassObject().

В начало