Содержание
  
 Задание №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). Чисто виртуальные функции не реализуютсяв классах, в которых объявлены.  ............