Шаг 25 - Создаем класс фабрики классов

Давайте создадим новый класс CClassFactory. Создавайте через New Class. В результате у Вас будут созданны два файла

ClassFactory.h
ClassFactory.cpp
Описание класса необходимо изменить, чтобы он унаследовал интерфейс IClassFactory
#include "ole2.h"

class CClassFactory  : public IClassFactory
{
public:
	CClassFactory();
	virtual ~CClassFactory();
};

Вот теперь, чтобы использовать наш класс надо подключить описание его в файл CPP самой библиотеки. Теперь мы можем попробовать объвить ссылку на класс фабрики классов.

STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv )
{
	CClassFactory *cf;
	cf=new CClassFactory;
        return S_OK;
}

Так вот, если Вы напишите вот так, а это написано правильно, то получите кучу сообщений об ошибках. И правильно, сообщения примерно такие.

D:\PROJECT\MyCom\mycom.cpp(8) : warning C4259: 'long __stdcall IUnknown::QueryInterface(const struct _GUID &,void ** )' : pure virtual function was not defined
        e:\microsoft visual studio\vc98\include\unknwn.h(109) : see declaration of 'QueryInterface'
D:\PROJECT\MyCom\mycom.cpp(8) : warning C4259: 'unsigned long __stdcall IUnknown::AddRef(void)' : pure virtual function was not defined
        e:\microsoft visual studio\vc98\include\unknwn.h(113) : see declaration of 'AddRef'

Дествительно, реализация этих функций необходима. И мы должны были её сделать. Давайте объявим эти функции в классе. Эти объявления должны быть Вам хоть немного знакомы.

class CClassFactory  : public IClassFactory
{
protected:
    long        m_lRef;
public:
	CClassFactory();
	virtual ~CClassFactory();
	//  IUnknown
	STDMETHOD(  QueryInterface(REFIID,  void**  ));
	STDMETHOD_(ULONG,  AddRef());    
	STDMETHOD_(ULONG,  Release());
	//  IClassFactory
	STDMETHOD(CreateInstance)(LPUNKNOWN,  REFIID,  void**);
	STDMETHOD(LockServer)(BOOL);
};

Заметили, что методы есть и интерфейса IUnknown ? Хотя он не упоминается ? Нет упоминается. Фабрика классов наследуется от IUnknown из определения интерфейса:

MIDL_INTERFACE("00000001-0000-0000-C000-000000000046")
    IClassFactory : public IUnknown
    {
    public:
......

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