Шаг 27 - Класс для фабрики классов

В определении фабрики классов есть функция CreateInstance, с помощью этой функции производится создание нового COM сервера. Вот её определение.

HRESULT CreateInstance
(  
	IUnknown * pUnkOuter,
	REFIID riid,       
	void ** ppvObject  
);

Идея такая. Клиент получает указатель на фабрику классов и вызывает этот метод для получения нового класса. Это примерно тоже, что и new. Результат работы этой функции должен быть вот такой.

S_OK 				// нормально
CLASS_E_NOAGGREGATION 		// не могла я сделать обьект
E_NOINTERFACE 			// нет интерфейса

Давайте создадим класс, который наследует методы IUnknown при этом нам придется создать два класса.

класс IStep 
класс Step

В классе IStep будут объявлены все интерфейсы, а в классе Step они будут реализованы. Добавляйте класс IStep. В этом же файле лучше объявить и идентификаторы GUID для объектов, которые надо сгенерировать GUIDGEN.

// IStep.h: interface for the IStep class.
//
//////////////////////////////////////////////

..............

#include "ole2.h"

// {3F5942E1-108B-11d4-B050-000001260696}
DEFINE_GUID(CLSID_Step, 
0x3f5942e1, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96);

DEFINE_GUID(IID_Step, 
0x3f5942e2, 0x108b, 0x11d4, 0xb0, 0x50, 0x0, 0x0, 0x1, 0x26, 0x6, 0x96);

class IStep : public IUnknown  
{
public:
	IStep();
	virtual ~IStep();
	STDMETHOD(MyComMessage) ()  PURE;
};

А вот теперь можно создать и сам класс Step с реализацией интерфейсов. Создавайте этот класс как порожденный от IStep. Вот его описание.

#include "IStep.h"

class Step : public IStep  
{
public:
	Step();
	virtual ~Step();
    
	//  IUnknown
	STDMETHOD(QueryInterface(  REFIID,  void**  ));
    	STDMETHOD_(ULONG,  AddRef());   
	STDMETHOD_(ULONG,  Release());    
	//  IStep
    	STDMETHOD(MyComMessage) ();
};

Ну и в класс фабрики классов нужно включить объявления на этот класс для дальнейшего использования его в CreateInstance.

#include "step.h"

extern  long  g_lLocks;

class CClassFactory  : public IClassFactory
{
	......
}

Не компилируйте пока приложение, так как получите сообщения о куче нереализованных методах. Мы просто пока подготовили классы.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 12.04.2000