Чтение онлайн

на главную

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

pBookObj = new CoBook;

hr = pBookObj — > QueryInterface(riid, ppv);

При неудаче получения интерфейса, созданный объект уничтожается.

В методе LockServer глобальный счетчик блокировок сервера в памяти увеличивается или уменьшается на единицу в зависимости от значения параметра fLock.

Совершенно аналогично определяется и реализуется фабрика класса CoJournalFactory для кокласса СоJournal.

//////////////////////////////////////////////////

// СоJournalFactory.h:

заголовочный файл для класса

// CoJournaiFactory — фабрики класса для класса CoJournal

//////////////////////////////////////////////////

#ifndef _CoJournalFactory_

#define _CoJournalFactory

#include "CoJournal.h"

class CoJournalFactory: public IClassFactory

{

public:

CoJournalFactory ;

virtual ~CoJournalFactory;

//IUnknown

STDMETHODIMP Querylnterface(REFIID riid, void** pIFace);

STDMETHODIMP_(ULONG)AddRef;

STDMETHODIMP_(ULONG)Release;

//IClassFactory

STDMETHODIMP LockServer(BOOL fLock);

STDMETHODIMP Createlnstance(LPUNKNOWN pUnkOuter,

REFIID riid, void** ppv);

private:

ULONG m_refCount;

};

#endif

И теперь реализация фабрики класса СоJournalFactory для класса CoJournal.

//////////////////////////////////////////////////

// СоJournalFactory.срр: реализация фабрики класса СоJournalFactory

// для кокласса CoJournal

//////////////////////////////////////////////////

#include "СоJournalFactory.h"

extern ULONG g_lockCount;

extern ULONG g_objCount;

//////////////////////////////////////////////////

// Конструктор и деструктор

//////////////////////////////////////////////////

CoJournalFactory::СоJournalFactory

{

m_refCount = 0;

g_objCount++;

}

CoJournalFactory::~CoJournalFactory

{

g_obj Count-;

}

//IUnknown

STDMETHODIMP_(ULONG) CoJournalFactory::AddRef {

return ++m_refCount;

}

STDMETHODIMP_(ULONG) CoJournalFactory::Release

{

if (-m_refCount == 0)

{

delete this;

return 0;

}

else

return m refCount;

}

STDMETHODIMP CoJournalFactory::Querylnterface(REFIID riid, void** ppv)

{

if(riid == IID_IUnknown)

{

*ppv = (IUnknown*)this;

}

else if(riid == IID_IClassFactory)

{

*ppv = (IdassFactory*) this;

}

else

{

*ppv = NULL;

return E_NOINTERFACE;

}

(IUnknown*)(*ppv)) — >AddRef;

return S OK;

}

//IClassFactory

STDMETHODIMP CoJournaiFactory::Createlnstance(

LPUNKNOWN pUnkOuter, REFIID riid, void** ppv)

{

if(pUnkOuter!= NULL)

{

return СLASS_E_NOAGGREGATION;

}

CoJournal* pJournalObj = NULL;

HRESULT hr;

pJournalObj = new CoJournal;

hr = pJournalObj — > QueryInterface(riid, ppv);

if (FAILED(hr))

delete pJournalObj;

return hr;

}

STDMETHODIMP CoJournalFactory::LockServer(BOOL fLock)

{

if (fLock)

++g_lockCount;

else

– -g_lockCount;

return S OK;

}

Заканчивая разговор о фабрике класса нужно заметить, что для нее не нужно задавать GUID.

Сервер в процессе клиента

Итак, для активации некоторого СОМ объекта необходимо создать фабрику класса для соответствующего класса и получить указатель на интерфейс IClassFactory. Далее, используя этот интерфейс, можно создать любое число экземпляров этого кокласса и получить указатели на любые реализуемые коклассом интерфейсы. Но как создать фабрику класса?

Все, что достаточно знать клиенту о коклассе, это его глобальный идентификатор (GUID). Зная этот идентификатор, клиент может воспользоваться функцией CoGetClassObject, которая заставит менеджер управления сервисом найти и загрузить нужный сервер (в котором "живет" нужный кокласс), активизировать фабрику класса для этого кокласса и возвратить клиенту указатель на интерфейс IClassFactory.

Всю необходимую информацию менеджер получает из реестра системы. Подробнее это будет обсуждаться далее, пока достаточно заметить, что реестр представляет собой специальную базу данных, используя которую, в частности, по глобальному идентификатору кокласса можно узнать тип сервера, в котором этот кокласс "живет" (сервер в процессе клиента, сервер в другом процессе на этой же машине или сервер на удаленной машине), путь к серверу (для серверов на данной машине) или путь к удаленной машине (для сервера на удаленной машине).

Далее работа менеджера зависит от типа сервера.

Пока мы строим сервер в процессе клиента, реализуемый в виде dll. Для этого, при работе в Visual C++, можно создать пустое рабочее пространство проекта Win32 DLL с именем PubInPrосServer. В этом проекте нужно создать (или перенести созданные в другом месте) классы CoBook, CoJournal, CoBookFactory, СоJournalFactory. Там же ДОЛЖНЫ находиться файлы с определениями интерфейсов IPub, IBook, IJournal, файл с GUID для всех интерфейсов и коклассов iid.h и (как советует Э.Трельсен в книге [3]) следующий файл iid.cpp

Поделиться:
Популярные книги

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Особое назначение

Тесленок Кирилл Геннадьевич
2. Гарем вне закона
Фантастика:
фэнтези
6.89
рейтинг книги
Особое назначение

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Семья. Измена. Развод

Высоцкая Мария Николаевна
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Семья. Измена. Развод

(Не)нужная жена дракона

Углицкая Алина
5. Хроники Драконьей империи
Любовные романы:
любовно-фантастические романы
6.89
рейтинг книги
(Не)нужная жена дракона

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Сиротка 4

Первухин Андрей Евгеньевич
4. Сиротка
Фантастика:
фэнтези
попаданцы
6.00
рейтинг книги
Сиротка 4

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор

Хочу тебя любить

Тодорова Елена
Любовные романы:
современные любовные романы
5.67
рейтинг книги
Хочу тебя любить

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости

Дело Чести

Щукин Иван
5. Жизни Архимага
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Дело Чести

Кодекс Крови. Книга VIII

Борзых М.
8. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VIII