|
|
#ifndef _STATIC_CLASS_FACTORY_
#define _STATIC_CLASS_FACTORY_
/*
* Class Factory Implementation for C++ without CTRStartup required. */
#ifdef __cplusplus
#ifdef UNIX
#define STDMETHODX STDMETHOD
#define STDMETHODX_ STDMETHOD_
#define DECLARE_CLASS_FACTORY(cf) \
class cf: public IClassFactory \ { \ public: \ STDMETHODX (QueryInterface)(REFIID, void **); \ STDMETHODX_(ULONG, AddRef)(); \ STDMETHODX_(ULONG, Release)(); \ \ STDMETHODX (CreateInstance)(IUnknown *, REFIID, void **); \ STDMETHODX (LockServer)(BOOL); \ } \
#else // UNIX
#define STDMETHODX(fn) HRESULT __stdcall fn
#define STDMETHODX_(ret,fn) ret __stdcall fn
#define DECLARE_CLASS_FACTORY(cf) \
class cf \ { \ public: \ void *vtable; \ STDMETHODX (QueryInterface)(REFIID, void **); \ STDMETHODX_(ULONG, AddRef)(); \ STDMETHODX_(ULONG, Release)(); \ \ STDMETHODX (CreateInstance)(IUnknown *, REFIID, void **); \ STDMETHODX (LockServer)(BOOL); \ } \
#endif // UNIX
DECLARE_CLASS_FACTORY( CClassFactory );
struct IClassFactoryVtbl { // *** IUnknown methods ***
HRESULT (STDMETHODCALLTYPE CClassFactory::* QueryInterface) ( REFIID riid, LPVOID FAR* ppvObj) ; ULONG (STDMETHODCALLTYPE CClassFactory::*AddRef) () ; ULONG (STDMETHODCALLTYPE CClassFactory::*Release) () ;
// *** IClassFactory methods ***
HRESULT (STDMETHODCALLTYPE CClassFactory::*CreateInstance) ( LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppvObject) ; HRESULT (STDMETHODCALLTYPE CClassFactory::*LockServer)(BOOL); };
typedef struct IClassFactoryVtbl IClassFactoryVtbl;
//
// class CObjectInfo
//
typedef HRESULT (*LPFNCREATEINSTANCE)(IUnknown *punkOuter, REFIID riid, void **ppvOut);
class CObjectInfo : public CClassFactory { public: CObjectInfo(CLSID const* pclsidin, LPFNCREATEINSTANCE pfnCreatein) { pclsid = pclsidin; pfnCreate = pfnCreatein; } CLSID const* pclsid; LPFNCREATEINSTANCE pfnCreate; };
const IClassFactoryVtbl c_CFVtbl = { CClassFactory::QueryInterface, CClassFactory::AddRef, CClassFactory::Release, CClassFactory::CreateInstance, CClassFactory::LockServer };
//
// CLASS FACTORY TABLE STUFF
//
typedef struct { const IClassFactoryVtbl *cf; const CLSID *rclsid; HRESULT (*pfnCreate)(IUnknown *, REFIID, void **); } OBJ_ENTRY;
#ifdef UNIX
#define CF_TABLE_BEGIN(cfTable) const CObjectInfo cfTable[] = {
#define CF_TABLE_ENTRY(pclsid, pfnCreate) CObjectInfo( pclsid, pfnCreate),
#define CF_TABLE_END(cfTable) \
CF_TABLE_ENTRY(NULL, NULL) };
#define GET_ICLASSFACTORY(ptr) SAFECAST( ptr, IClassFactory *)
#else
#define CF_TABLE_BEGIN(cfTable) const OBJ_ENTRY cfTable##_tble[] = {
#define CF_TABLE_ENTRY(pClsid, pfnCreate ) { &c_CFVtbl, pClsid, pfnCreate },
#define CF_TABLE_END(cfTable) \
CF_TABLE_ENTRY(NULL, NULL) }; \ const CObjectInfo *cfTable = (CObjectInfo *)cfTable##_tble;
#define GET_ICLASSFACTORY(ptr) (&(ptr->vtable))
#endif
#endif // __cplusplus
#endif // _STATIC_CLASS_FACTORY_
|