Распределенная обработка данных

Контрольная работа - Компьютеры, программирование

Другие контрольные работы по предмету Компьютеры, программирование

Содержание

 

Задание №1 Реализация интерфейса COM

Задание №1А QueryInterface

Задание №1B Подсчет ссылок

 

Задание №1 Реализация интерфейса COM

 

Цель работы:

Разработать код на С++, реализующий простой интерфейс СОМ без динамической компоновки:

  1. клиент и компонент взаимодействуют через два интерфейса IX иIY, интерфейсы COM реализованы как чисто абстрактные базовые классы С++;
  2. в качестве клиента использовать процедуру main;
  3. компонент реализуется классом СА, который наследует как IX так и IY;
  4. класс СА реализует функции-члены обоих интерфейсов (множественное наследование);
  5. клиент создает экземпляр компонента (для управления существованием компонента клиент применяет оператора new и delete), далее он получает указатели на интерфейсы, поддерживаемые компонентом, использовать эти указатели анологично указателям на классы С++;
  6. выводить промежуточные сообщения при использовании интерфейсов IX и IY;
  7. удалить компонент;
  8. вместо определения интерфейса как класса использовать определение из заголовочного файла 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). Чисто виртуальные функции не реализуютсяв классах, в которых объявлены. Как видно из приведенного выше примера, функции IX::Fx1, IX::Fx2, IY::Fy1 и IY::Fy2 только декларируются. Реализуются же они в производном классе. В приведенном фрагменте кода компонент CA наследует два чисто абстрактных базовых класса IX и IY и реализует их чисто виртуальные функции.

Для того, чтобы реализовать функции-члены IX и IY, CA использует множественное наследование. Последнее означает, что класс является производным более чем от одного базового класса. Класс С++ чаще всего использует единичное наследование, т.е. имеет только один базовый класс.

 

Текст программы:

 

#include "stdafx.h"

#include "iostream.h"

#include "objbase.h" // Определить интерфейс

#include "conio.h"

void trace(const char* pMsg) { cout << pMsg << endl; }

// Абстрактные интерфейсы

interface IX

{

virtual void __stdcall Fx1() = 0;

virtual void __stdcall Fx2() = 0;

};

interface IY

{

virtual void __stdcall Fy1() = 0;

virtual void __stdcall Fy2() = 0;

};

 

// Реализация интерфейса

class CA : public IX,

public IY

{

public:

// Реализация интерфейса IX

virtual void __stdcall Fx1() { cout << "CA::Fx1" << endl; }

virtual void __stdcall Fx2() { cout << "CA::Fx2" << endl; }

 

// Реализация интерфейса IY

virtual void __stdcall Fy1() { cout << "CA::Fy1" << endl; }

virtual void __stdcall Fy2() { cout << "CA::Fy2" << endl; }

};

 

// Клиент

int main()

{

trace("Client: Sozdanie ekzemplyra komponenta");

CA* pA = new CA;

 

// Получить указатель IX

IX* pIX = pA;

trace("Client: Ispolzovanie interface IX");

pIX->Fx1();

pIX->Fx2();

 

// Получить указатель IY

IY* pIY = pA;

trace("Client: Ispolzovanie interface IY");

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 этого комп