Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* registrar.hxx * * * Copyright (c) 1998 Microsoft Corporation * * PURPOSE: Defines the CCoCreateInstanceRef class * * * OWNER: vivekj */
/* template CCoCreateInstanceRef
* * PURPOSE: Encapsulates calling CoCreateInstance to create a pointer. * The first time the object is referenced, CoCreateInstance is * called. Subsequent references return the pointer. * * * PARAMETERS: T: The interface class, eg IRegistrar * rclsid: The class ID, eg CLSID_Registrar * riid: The interface ID eg IID_IRegistrar * */
#ifndef _REGISTRAR
#define _REGISTRAR
template<class T, const IID* pclsid, const IID* piid> class CCoCreateInstanceRef { typedef CComQIPtr<T, piid> t_ptr; t_ptr m_ip; public: operator T &() { SC sc;
if(!m_ip) { sc = CoCreateInstance(*pclsid, NULL, CLSCTX_INPROC_SERVER, *piid, (void **)&m_ip); if(sc) goto Error; } Cleanup: return *(static_cast<T *>(m_ip));
Error: throw(sc); goto Cleanup; }
};
#define DEFINE_COCREATEINSTANCEREF(_a, _b) \
template CCoCreateInstanceRef<I##_a, &_b, &IID_I##_a>; \ typedef CCoCreateInstanceRef<I##_a, &_b, &IID_I##_a> C##_a;
// Create the CRegistrar class.
DEFINE_COCREATEINSTANCEREF(Registrar, CLSID_Registrar)
#endif // _REGISTRAR
|