home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************************
- * Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
- *
- * File:
- * ClassFactory.cpp
- *
- * Description:
- *
- *
- *
- ***************************************************************************************/
- #include "ClassFactory.h"
-
-
- /***************************************************************************************
- ******************** ********************
- ******************** CClassFactory Implementation ********************
- ******************** ********************
- ***************************************************************************************/
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* private */
- CClassFactory::CClassFactory()
- {
-
- } // ctor
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- CClassFactory::CClassFactory( const COCLASS_REGISTER *pCoClass ) :
- m_refCount( 1 ),
- m_pCoClass( pCoClass )
- {
-
- } // ctor
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- CClassFactory::~CClassFactory()
- {
-
- } // dtor
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- ULONG CClassFactory::AddRef()
- {
-
- return InterlockedIncrement( &m_refCount );
-
- } // CClassFactory::AddRef
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- ULONG CClassFactory::Release()
- {
- long refCount;
-
-
- refCount = InterlockedDecrement( &m_refCount );
- if ( refCount == 0 )
- delete this;
-
-
- return refCount;
-
- } // CClassFactory::Release
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- HRESULT CClassFactory::QueryInterface( REFIID riid, void **ppInterface )
- {
- if ( riid == IID_IUnknown )
- *ppInterface = static_cast<IUnknown *>( this );
-
- else if ( riid == IID_IClassFactory )
- *ppInterface = static_cast<IClassFactory *>( this );
-
- else
- {
- *ppInterface = NULL;
-
-
- return E_NOINTERFACE;
- }
-
- reinterpret_cast<IUnknown *>( *ppInterface )->AddRef();
-
-
- return S_OK;
-
- } // CClassFactory::QueryInterface
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- HRESULT CClassFactory::CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppInstance )
- {
- // aggregation is not supported by these objects
- if ( pUnkOuter != NULL )
- return CLASS_E_NOAGGREGATION;
-
-
- // ask the object to create an instance of itself, and check the iid.
- return (*m_pCoClass->pfnCreateObject)( riid, ppInstance );
-
- } // CClassFactory::CreateInstance
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- /* public */
- HRESULT CClassFactory::LockServer( BOOL fLock )
- {
-
- return S_OK;
-
- } // CClassFactory::LockServer
-
-
- /***************************************************************************************
- ******************** ********************
- ******************** Dll Registration Helpers ********************
- ******************** ********************
- ***************************************************************************************/
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- STDAPI DllRegisterServer()
- {
- HRESULT hr = S_OK;
- char rcModule[_MAX_PATH];
- const COCLASS_REGISTER *pCoClass;
-
-
- DllUnregisterServer();
- GetModuleFileNameA( GetModuleInst(), rcModule, NumItems( rcModule ) );
-
- // for each item in the coclass list, register it
- for ( pCoClass = g_CoClasses; (SUCCEEDED( hr ) && (pCoClass->pClsid != NULL)); pCoClass++ )
- {
- // register the class with default values
- hr = REGUTIL::RegisterCOMClass( *pCoClass->pClsid,
- g_szCoclassDesc,
- g_szProgIDPrefix,
- g_iVersion,
- pCoClass->szProgID,
- g_szThreadingModel,
- rcModule );
- } // for
-
-
- if ( FAILED( hr ) )
- DllUnregisterServer();
-
-
- return hr;
-
- } // DllRegisterServer
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- STDAPI DllUnregisterServer()
- {
- const COCLASS_REGISTER *pCoClass;
-
-
- // for each item in the coclass list, unregister it
- for ( pCoClass = g_CoClasses; pCoClass->pClsid != NULL; pCoClass++ )
- {
- REGUTIL::UnregisterCOMClass( *pCoClass->pClsid,
- g_szProgIDPrefix,
- g_iVersion,
- pCoClass->szProgID );
- } // for
-
-
- return S_OK;
-
- } // DllUnregisterServer
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv )
- {
- CClassFactory *pClassFactory;
- const COCLASS_REGISTER *pCoClass;
- HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
-
-
- // scan for the right one
- for ( pCoClass = g_CoClasses; pCoClass->pClsid != NULL; pCoClass++ )
- {
- if ( *pCoClass->pClsid == rclsid )
- {
- pClassFactory = new CClassFactory( pCoClass );
- if ( pClassFactory != NULL )
- {
- hr = pClassFactory->QueryInterface( riid, ppv );
-
- pClassFactory->Release();
- break;
- }
- else
- {
- hr = E_OUTOFMEMORY;
- break;
- }
- }
- } // for
-
-
- return hr;
-
- } // DllGetClassObject
-
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- HINSTANCE GetModuleInst()
- {
- return g_hInst;
-
- } // GetModuleInst
-
-
- /***************************************************************************************
- ******************** ********************
- ******************** DllMain Implementation ********************
- ******************** ********************
- ***************************************************************************************/
-
- /***************************************************************************************
- * Method:
- *
- *
- * Purpose:
- *
- *
- * Parameters:
- *
- *
- * Return value:
- *
- *
- * Notes:
- *
- ***************************************************************************************/
- BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )
- {
- // save off the instance handle for later use
- switch ( dwReason )
- {
- case DLL_PROCESS_ATTACH:
- g_hInst = hInstance;
- DisableThreadLibraryCalls( hInstance );
- break;
-
- case DLL_PROCESS_DETACH:
- {
- // lpReserved == NULL means that we called FreeLibrary()
- // in that case do nothing
- if ( (lpReserved != NULL) && (g_pCallbackObject != NULL) )
- g_pCallbackObject->DllExitShutdown();
-
- }
- break;
-
- default:
- break;
- }
-
-
- return TRUE;
-
- } // DllMain
-
-
- // End of File
-
-
-
-