Фабрика класса - это 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;
}
|