1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#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
//
class CUnknown ;
typedef HRESULT (*FPCREATEINSTANCE)(IUnknown*, CUnknown**) ;
///////////////////////////////////////////////////////////
//
// 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 char* m_RegistryName ;
// ProgID
const char* m_szProgID ;
// Version-independent ProgID
const char* m_szVerIndProgID ;
// Helper function for finding the class ID
BOOL IsClassID(const CLSID& clsid) const
{ return (*m_pCLSID == clsid) ;}
// Type Library ID
const GUID* m_pLIBID ;
//
// Out of process server support
//
// Pointer to running class factory for 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* pUnknownOuter,
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() { }
//
// 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() ;
// Function 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
|