Фабрика класса.

Фабрика класса - это COM объект, который служит для создания других объектов. Она нужна для того, чтобы иметь возможность контролировать процесс создания и инициализации COM объекта.

Для создания компонента клиент должен вызвать функцию CoCreateInstance(). CoCreateInstance() создает фабрику класса и использует ее интерфейс IClassFactory для создания COM объекта. Интерфейс IClassFactory состоит из двух функций. Функция CreateInstance() создает запрашиваемый компонент. Функция LockServer() служит для удержания сервера в памяти до окончания работы с фабрикой класса.

Для создания экземпляра фабрики класса предназначена функция библиотеки COM CoGetClassObject().

Рассмотрим пример реализации фабрики класса.

class CFactory : public IClassFactory
{
public:
...
  STDMETHODIMP QueryInterface(const IID& iid,void** ppv);
  STDMETHODIMP_(ULONG) AddRef();
  STDMETHODIMP_(ULONG) Release();

  STDMETHODIMP CreateInstance(IUnknown*  pUnknownOuter,
                              const IID& iid,
                              void**     ppv);
  STDMETHODIMP LockServer(BOOL bLock);
}

STDMETHODIMP CFactory::CreateInstance(IUnknown*  pUnknownOuter,
                                      const IID& iid,
                                      void**     ppv)
{
  HRESULT hr;

  if(pUnknownOuter!=NULL) return CLASS_E_NOAGGREGATION;

  CMyComObject* pMyComObject=new CMyComObject;

  hr=pMyComObject->QueryInterface(iid,ppv);

  if(FAILED(hr)) delete pMyComObject;
  
  return hr;
}

STDMETHODIMP CFactory::LockServer(BOOL bLock)
{
  if(bLock) InterlockedIncrement(&g_iServerCount);
  else      InterlockedDecrement(&g_iServerCount);

  return S_OK;
}
						


Hosted by uCoz