//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1993 - 1999. // // File: ClassFactory.cpp // // Contents: com class factory routines // //---------------------------------------------------------------------------- #include "priv.h" #include "UserOM.h" // needed for class factory prototypes class CSHGinaFactory : public IClassFactory { public: // *** IUnknown *** virtual STDMETHODIMP_(ULONG) AddRef(void); virtual STDMETHODIMP_(ULONG) Release(void); virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj); // *** IClassFactory *** virtual STDMETHODIMP CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObject); virtual STDMETHODIMP LockServer(BOOL fLock); public: CSHGinaFactory(REFCLSID rclsid); ~CSHGinaFactory(void); // friend Functions friend HRESULT CSHGinaFactory_Create(REFCLSID rclsid, REFIID riid, LPVOID * ppvObj); protected: int _cRef; CLSID _rclsid; }; // // IUnknown Interface // ULONG CSHGinaFactory::AddRef() { _cRef++; return _cRef; } ULONG CSHGinaFactory::Release() { ASSERT(_cRef > 0); _cRef--; if (_cRef > 0) { return _cRef; } delete this; return 0; } HRESULT CSHGinaFactory::QueryInterface(REFIID riid, void **ppvObj) { HRESULT hr = E_NOINTERFACE; *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { *ppvObj = SAFECAST(this, IClassFactory*); AddRef(); hr = S_OK; } return hr; } // // IClassFactory methods // HRESULT CSHGinaFactory::CreateInstance(IUnknown* punkOuter, REFIID riid, LPVOID* ppvObj) { HRESULT hr = ResultFromScode(REGDB_E_CLASSNOTREG); *ppvObj = NULL; if (!punkOuter) { if (IsEqualIID(_rclsid, CLSID_ShellLogonEnumUsers)) { hr = CLogonEnumUsers_Create(riid, ppvObj); } else if (IsEqualIID(_rclsid, CLSID_ShellLogonUser)) { hr = CLogonUser_Create(riid, ppvObj); } else if (IsEqualIID(_rclsid, CLSID_ShellLocalMachine)) { hr = CLocalMachine_Create(riid, ppvObj); } else if (IsEqualIID(_rclsid, CLSID_ShellLogonStatusHost)) { hr = CLogonStatusHost_Create(riid, ppvObj); } else { // What are you looking for? ASSERTMSG(FALSE, "CSHGinaFactory::CreateInstance unable to create object."); hr = E_FAIL; } } else { // Does anybody support aggregation any more? hr = ResultFromScode(CLASS_E_NOAGGREGATION); } return hr; } HRESULT CSHGinaFactory::LockServer(BOOL fLock) { if (fLock) { DllAddRef(); } else { DllRelease(); } return S_OK; } HRESULT CSHGinaFactory_Create(REFCLSID rclsid, REFIID riid, LPVOID* ppvObj) { HRESULT hr; *ppvObj = NULL; if (IsEqualIID(riid, IID_IClassFactory) || IsEqualIID(riid, IID_IUnknown)) { *ppvObj = (LPVOID) new CSHGinaFactory(rclsid); if (*ppvObj) { hr = S_OK; } else { hr = E_OUTOFMEMORY; } } else { hr = ResultFromScode(E_NOINTERFACE); } return hr; } CSHGinaFactory::CSHGinaFactory(REFCLSID rclsid) : _cRef(1) { _rclsid = rclsid; DllAddRef(); } CSHGinaFactory::~CSHGinaFactory() { DllRelease(); }