163 lines
4.4 KiB
C++
163 lines
4.4 KiB
C++
//*********************************************************************
|
|
//* Microsoft Windows **
|
|
//* Copyright(c) Microsoft Corp., 1999 **
|
|
//*********************************************************************
|
|
//
|
|
// CFACTORY.H - Header file for the Implementation of IClassFactory
|
|
//
|
|
// HISTORY:
|
|
//
|
|
// 1/27/99 a-jaswed Created.
|
|
//
|
|
// Base class for reusing a single class factory for all
|
|
// components in a DLL.
|
|
|
|
#ifndef __CFactory_h__
|
|
#define __CFactory_h__
|
|
|
|
#include "cunknown.h"
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// Forward reference.
|
|
//
|
|
class CFactoryData;
|
|
|
|
// Global data used by CFactory.
|
|
extern CFactoryData g_FactoryDataArray[];
|
|
extern int g_cFactoryDataEntries;
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
// Component creation function pointer.
|
|
//
|
|
typedef HRESULT (*FPCREATEINSTANCE)(IUnknown*, CUnknown**);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
// typedefs
|
|
//
|
|
// The special registration function is used to add custom registration and
|
|
// unregistration code to the component. It takes a single parameter.
|
|
// TRUE = Reg and FALSE = UnReg.
|
|
typedef void (*FPSPECIALREGISTRATION)(BOOL);
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
// CFactoryData -
|
|
//
|
|
// Information CFactory needs to create a component supported
|
|
// by the DLL.
|
|
|
|
class CFactoryData
|
|
{
|
|
public:
|
|
// The class ID for the component
|
|
const CLSID* m_pCLSID;
|
|
|
|
// Pointer to the function that creates it
|
|
FPCREATEINSTANCE CreateInstance;
|
|
|
|
// Name of the component to register in the registry
|
|
const WCHAR* m_RegistryName;
|
|
|
|
// ProgID
|
|
const WCHAR* m_szProgID;
|
|
|
|
// Version independent ProgID
|
|
const WCHAR* m_szVerIndProgID;
|
|
|
|
// Helper function for finding the class id
|
|
BOOL IsClassID(const CLSID& clsid) const
|
|
{return (*m_pCLSID == clsid) ;}
|
|
|
|
// Function for performing special registration
|
|
FPSPECIALREGISTRATION SpecialRegistration ;
|
|
|
|
//----- Out of process server support -----
|
|
|
|
// Pointer running class factory associated with this component.
|
|
IClassFactory* m_pIClassFactory ;
|
|
|
|
// Magic cookie to identify running object
|
|
DWORD m_dwRegister ;
|
|
} ;
|
|
|
|
|
|
///////////////////////////////////////////////////////////
|
|
//
|
|
// Class Factory
|
|
//
|
|
class CFactory : public IClassFactory
|
|
{
|
|
public:
|
|
// IUnknown
|
|
virtual HRESULT __stdcall QueryInterface( const IID& iid,
|
|
void** ppv) ;
|
|
virtual ULONG __stdcall AddRef() ;
|
|
virtual ULONG __stdcall Release() ;
|
|
|
|
// IClassFactory
|
|
virtual HRESULT __stdcall CreateInstance( IUnknown* pUnkOuter,
|
|
const IID& iid,
|
|
void** ppv) ;
|
|
virtual HRESULT __stdcall LockServer(BOOL bLock);
|
|
|
|
// Constructor - Pass pointer to data of component to create.
|
|
CFactory(const CFactoryData* pFactoryData) ;
|
|
|
|
// Destructor
|
|
~CFactory() {/*empty*/ }
|
|
|
|
// ----- static FactoryData support functions. -----
|
|
|
|
// DllGetClassObject Support
|
|
static HRESULT GetClassObject( const CLSID& clsid,
|
|
const IID& iid,
|
|
void** ppv);
|
|
|
|
// Helper function for DllCanUnloadNow
|
|
static BOOL IsLocked()
|
|
{ return (s_cServerLocks > 0) ; }
|
|
|
|
// Functions to [Un]Register all components.
|
|
static HRESULT RegisterAll();
|
|
static HRESULT UnregisterAll();
|
|
|
|
// Functions to determine if component can be unloaded.
|
|
static HRESULT CanUnloadNow();
|
|
|
|
|
|
#ifdef _OUTPROC_SERVER_
|
|
// ----- Out of process server support -----
|
|
|
|
static BOOL StartFactories() ;
|
|
static void StopFactories() ;
|
|
|
|
static DWORD s_dwThreadID;
|
|
|
|
// Shut down the application.
|
|
static void CloseExe()
|
|
{
|
|
if (CanUnloadNow() == S_OK)
|
|
{
|
|
::PostThreadMessage(s_dwThreadID, WM_QUIT, 0, 0);
|
|
}
|
|
}
|
|
#else
|
|
// CloseExe doesn't do anything if we are in process.
|
|
static void CloseExe() {/*Empty*/}
|
|
#endif
|
|
|
|
public:
|
|
// Reference Count
|
|
LONG m_cRef;
|
|
|
|
// Pointer to information about class this factory creates.
|
|
const CFactoryData* m_pFactoryData;
|
|
|
|
// Count of locks
|
|
static LONG s_cServerLocks ;
|
|
|
|
// Module handle
|
|
static HMODULE s_hModule ;
|
|
};
|
|
|
|
#endif
|