83 lines
1.3 KiB
C++
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;
|
|
}
|
|
|