Эта функция входит в класс фабрики классов и её задача создать физически в памяти экземпляр класса.
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 ); }