mirror of
https://github.com/YutaItoh/3D-Eye-Tracker.git
synced 2025-09-26 23:09:19 +08:00
60 lines
1009 B
C++
60 lines
1009 B
C++
|
|
/** dirt-cheap replacement for CComPtr, which is not included in the free windows compilers */
|
|
template< class I >
|
|
class AutoComPtr
|
|
{
|
|
public:
|
|
|
|
AutoComPtr()
|
|
: p( 0 )
|
|
{}
|
|
|
|
AutoComPtr( const AutoComPtr< I >& o )
|
|
: p( o.p )
|
|
{
|
|
if ( p )
|
|
p->AddRef();
|
|
}
|
|
|
|
AutoComPtr( I* _p )
|
|
: p( _p )
|
|
{}
|
|
|
|
~AutoComPtr()
|
|
{
|
|
if ( p )
|
|
p->Release();
|
|
}
|
|
|
|
void Release()
|
|
{
|
|
if ( p )
|
|
p->Release();
|
|
p = 0;
|
|
}
|
|
|
|
I* operator->()
|
|
{ return p; }
|
|
|
|
operator I*()
|
|
{ return p; }
|
|
|
|
AutoComPtr< I >& operator=( const AutoComPtr< I >& o )
|
|
{
|
|
Release();
|
|
p = o.p;
|
|
if ( p )
|
|
p->AddRef();
|
|
return *this;
|
|
}
|
|
|
|
template< class O >
|
|
HRESULT QueryInterface( AutoComPtr< O >& o )
|
|
{ return p->QueryInterface( __uuidof( O ), reinterpret_cast< void** >( &o.p ) ); }
|
|
|
|
HRESULT CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter = 0, DWORD dwClsContext = CLSCTX_INPROC_SERVER )
|
|
{ return ::CoCreateInstance( rclsid, pUnkOuter, dwClsContext, __uuidof( I ), reinterpret_cast< void** >( &p ) ); }
|
|
|
|
I* p;
|
|
};
|