Шаг 29 - Реализуем функцию CreateInstance

Эта функция входит в класс фабрики классов и её задача создать физически в памяти экземпляр класса.

STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid,void** ppvObj)
{
	Step*       pStep;
	HRESULT     hr;
	*ppvObj  =  0;
	pStep  =  new  Step;
	if  (  pStep  ==  0  )
		return(  E_OUTOFMEMORY  );
	hr  =  pStep->QueryInterface(  riid,  ppvObj  );
	if  (FAILED(hr)) delete  pStep;

	return  hr;
}

Как видите используем оператор new для получения экземпляра объекта. А дальше запрашивается интерфейс. И если все нормально, то возвращается S_OK. Ну и теперь пора сделать нашу функцию, ради которой этот объект и создавался.

STDMETHODIMP   Step::MyComMessage()
{
	MessageBox(NULL,"It is my COM Object !!!!","Yes !!!",0);
	return  S_OK;
}

Пора сделать функцию для регистрации класса.

STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppv )
{
	HRESULT hr;
	CClassFactory *cf;
	if ( rclsid != CLSID_Step ) return( E_FAIL );

	cf=new CClassFactory;
	if ( cf == 0 ) return( E_OUTOFMEMORY );
	hr = cf->QueryInterface( riid, ppv );

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

И естественно функцию DllCanUnloadNow:

STDAPI DllCanUnloadNow(void)
{
	if ( g_lLocks )
		return( S_FALSE );
	else
		return( S_OK );
}

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