Контрольная работа: Распределенная обработка данных
pIY->Fy1();
pIY->Fy2();
trace("Client: Delete komponent");
delete pA;
getch();
return 0; }
Результат работы программы:
Вывод:
В данном задании мы реализововали простой интерфейс СОМ без динамической компоновки. Интерфейсы COM реализованы как чисто абстрактные базовые классы С++, в качестве клиента использовали процедуру main.
Задание 2 №1А QueryInterface
Цель работы:
1. Объявить интерфейсы IX, IY, IZ . Объявить интерфейс IUnknown.
2. Реализация компонента. Класс СА реализует компонент, поддерживающий интерфейсы IX и IY. Реализовать QueryInterface описанным выше способом. Функцию CreateInstance определить после класса CA. Клиент использует ее, чтобы создать компонент, представляемый при помощи СА, и получить указатель на IUnknown этого компонента. После CreateInstance определить IID для интерфейсов. (Для того, чтобы определить IID для IUnknown компоновать с UUID.LIB).
3. Реализация клиента, роль которого выполняет main. Клиент начинает с создания компонента при помощи CreateInstance. CreateInstance возвращает указатель на интерфейс IUnknown компонента. Клиент при помощи QueryInterface запрашивает через интерфейс IUnknown указатель на интерфейс IX компонента. Анологично запросить и IY. Использовать эти указатели для доступа к функциям-членам. Запросить интерфейс IZ. QueryInterface возвращает код ошибки, так как СА не реализует IZ. Далее Клиент запрашивает указатель на интерфейс IY через указатель на интерфейс IX, pIX. Поскольку компонент поддерживает IY, этот запрос будет успешным, и клиент сможет использовать возвращенный указатель на интерфейс IY так же, как он использовал первый указатель. Затем клиент запрашивает интерфейс IUnknown через указатель на IY. Поскольку все интерфейсы COM наследуют IUnknown, этот запрос должен быть успешным, причем возвращенный указатель совпадет с первым указателем, так как . QueryInterface возвращает один и тот же указатель на все запросы к IUnknown.
Теоретические сведения:
В COM клиент взаимодействует с компонентом с помощью интерфейса
IUnknown, который определен в заголовочном файле UNKWN.H:
Interface IUnknown
{
virtual HREZULT --stdcall QueryInterface( const IID&iid,
void * * ppv) = 0 ;
virtual ULONG --stdcall Addref( ) = 0 ;
virtual ULONG --stdcall Release( ) = 0 ;
};
Функцию с именем QueryInterface клиент вызывает, чтобы определить, поддерживает ли компонент некоторый интерфейс. У функции QueryInterface два параметра. Первый параметр – идентификатор интерфейса. Второй параметр - адрес, по которому QueryInterface помещает указатель на искомый интерфейс.
QueryInterface возвращает HREZULT – 32-разрядный код результата.
QueryInterface может возвратить либо S_OK, либо E_NOINTERFACE. Клиент не должен прямо сравнивать возвращаемое QueryInterface значение с этими константами; для проверки надо использовать макросы SUCCEEDED или FAILED.
Получение указателя на IUnknown