windows-nt/Source/XPSP1/NT/ds/adsi/router/auto_pv.h
2020-09-26 16:20:57 +08:00

83 lines
1.3 KiB
C++

#pragma once
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// auto_pv- auto PROPVARIANT releaser.
//
// pretty minimal functionality, designed to provide auto release only
//
class auto_pv : public ::tagPROPVARIANT {
public:
// Constructors
//
auto_pv() throw();
// Destructor
//
~auto_pv() throw();
// Low-level operations
//
void Clear() throw();
void Attach(PROPVARIANT& varSrc) throw();
PROPVARIANT Detach() throw();
bool Ownership(bool fOwns)
{ return _Owns = fOwns; }
protected:
bool _Owns;
};
// Default constructor
//
inline auto_pv::auto_pv() throw()
: _Owns(true)
{
::PropVariantInit(this);
}
// destructor
inline auto_pv::~auto_pv() throw()
{
if(_Owns)
::PropVariantClear(this);
else
::PropVariantInit(this);
}
// Clear the auto_var
//
inline void auto_pv::Clear() throw()
{
if(_Owns)
::PropVariantClear(this);
else
::PropVariantInit(this);
}
inline void auto_pv::Attach(PROPVARIANT& varSrc) throw()
{
//
// Free up previous VARIANT
//
Clear();
//
// Give control of data to auto_var
//
memcpy(this, &varSrc, sizeof(varSrc));
varSrc.vt = VT_EMPTY;
}
inline PROPVARIANT auto_pv::Detach() throw()
{
PROPVARIANT varResult = *this;
this->vt = VT_EMPTY;
return varResult;
}