62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
/*
|
|
* 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
|