В определении фабрики классов есть функция 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 { ...... }
Не компилируйте пока приложение, так как получите сообщения о куче нереализованных методах. Мы просто пока подготовили классы.