Содержание
Задание №1 Реализация интерфейса COM
Задание №1А QueryInterface
Задание №1B Подсчет ссылок
Задание №1 Реализация интерфейса COM
Цель работы:
Разработать код на С++, реализующий простой интерфейс СОМ без динамической компоновки:
- клиент и компонент взаимодействуют через два интерфейса IX иIY, интерфейсы COM реализованы как чисто абстрактные базовые классы С++;
- в качестве клиента использовать процедуру main;
- компонент реализуется классом СА, который наследует как IX так и IY;
- класс СА реализует функции-члены обоих интерфейсов (множественное наследование);
- клиент создает экземпляр компонента (для управления существованием компонента клиент применяет оператора new и delete), далее он получает указатели на интерфейсы, поддерживаемые компонентом, использовать эти указатели анологично указателям на классы С++;
- выводить промежуточные сообщения при использовании интерфейсов IX и IY;
- удалить компонент;
- вместо определения интерфейса как класса использовать определение из заголовочного файла OBJBASE.H
#define interface struct
и функции-члены объявлять с помощью
virtual void _stdcall … .
Теоретические сведения:
В СОМ интерфейсы — это все. Для клиента компонент представляет собой набор интерфейсов. Клиент может взаимодействовать с компонентом СОМ только через интерфейс. С точки зрения программиста СОМ, интерфейсы — важная часть любого приложения. Компоненты сами по себе есть просто детали реализации интерфейсов.
Утверждение, что компонент — всего лишь деталь реализации интерфейса, конечно, преувеличение. В конце концов, интерфейс без реализации ничего не сделает. Однако компонент можно удалить и заменить другим; если новый компонент поддерживает те же интерфейсы, что и старый, приложение будет работать по-прежнему. Отдельные компоненты сами по себе не определяют приложения. Приложение определяют интерфейсы между компонентами. Пока интерфейсы неизменны, компоненты могут появляться и исчезать
Теперь рассмотрим код, реализующий простой интерфейс. В приведенном ниже тексте программы компонент CA использует IX и IY для реализации двух интерфейсов.
class IX // Первый интерфейс
{
public:
virtual void Fx1() = 0;
virtual void Fx2() = 0;
};
class IY // Второй интерфейс
{
public:
virtual void Fy1() = 0;
virtual void Fy2() = 0;
};
class CA : public IX, public IY // Компонент
{
public:
// Реализация абстрактного базового класса IX
virtual void Fx1() { cout << “Fx1” << endl; }
virtual void Fx2() { cout << “Fx2” << endl; }
// Реализация абстрактного базового класса IY
virtual void Fy1() { cout << “Fy1” << endl; }
virtual void Fy2() { cout << “Fy2” << endl; }
};
IX и IY — это чисто абстрактные базовые классы, которые используются для реализации интерфейсов. Чистоабстрактный базовый класс (pure abstract base class) — это базовый класс, который содержит только чисто виртуальные функции (pure virtual functions). Чисто виртуальная функция — это виртуальная функция, «помеченная =0 — знаком спецификатора чистоты (pure specifier). Чисто виртуальные функции не реализуютсяв классах, в которых объявлены. ............