Давайте создадим новый класс 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: ......