windows-nt/Source/XPSP1/NT/base/fs/hsm/wsb/wsbvar.cpp
2020-09-26 16:20:57 +08:00

191 lines
2.8 KiB
C++

/*++
© 1998 Seagate Software, Inc. All rights reserved
Module Name:
wsbvar.cpp
Abstract:
This class is a wrapper for the VARIANT structure, providing
conversion and cleanup automatically. Current supported types
for conversion are OLECHAR * (BSTR), IUnknown / IDispatch, and
GUID. GUIDs are represented internally as strings.
Author:
Rohde Wakefield [rohde] 21-Jan-1997
Revision History:
--*/
#include "stdafx.h"
#include "wsb.h"
//
// OLECHAR (wide-character) methods
//
CWsbVariant::CWsbVariant ( const OLECHAR * string )
{
Init ( );
if ( 0 != ( bstrVal = WsbAllocString ( string ) ) )
vt = VT_BSTR;
}
CWsbVariant & CWsbVariant::operator = ( const OLECHAR * string )
{
Clear ( );
if ( 0 != ( bstrVal = WsbAllocString ( string ) ) )
vt = VT_BSTR;
return ( *this );
}
CWsbVariant::operator OLECHAR * ( )
{
if ( VT_BSTR != vt )
VariantChangeType ( this, this, 0, VT_BSTR );
return ( VT_BSTR == vt ) ? bstrVal : 0;
}
//
// COM Interface methods
//
CWsbVariant::CWsbVariant ( IUnknown * pUnk )
{
Init ( );
if ( 0 != pUnk ) {
punkVal = pUnk;
punkVal->AddRef ( );
vt = VT_UNKNOWN;
}
}
CWsbVariant::CWsbVariant ( IDispatch * pDisp )
{
Init ( );
if ( 0 != pDisp ) {
pdispVal = pDisp;
pdispVal->AddRef ( );
vt = VT_DISPATCH;
}
}
CWsbVariant::operator IUnknown * ( )
{
//
// Ok to return IDispatch as IUnknown since it
// derives from IUnknown
//
if ( IsInterface ( ) )
return punkVal;
return 0;
}
CWsbVariant::operator IDispatch * ( )
{
if ( IsDispatch ( ) ) {
return pdispVal;
}
if ( IsInterface ( ) ) {
IDispatch * pDisp;
if ( SUCCEEDED ( punkVal->QueryInterface ( IID_IDispatch, (void**)&pDisp ) ) ) {
punkVal->Release ( );
pdispVal = pDisp;
vt = VT_DISPATCH;
return ( pdispVal );
}
}
return 0;
}
CWsbVariant & CWsbVariant::operator = ( IUnknown * pUnk )
{
Clear ( );
vt = VT_UNKNOWN;
punkVal = pUnk;
punkVal->AddRef ( );
return ( *this );
}
CWsbVariant & CWsbVariant::operator = ( IDispatch * pDisp )
{
Clear ( );
vt = VT_DISPATCH;
pdispVal = pDisp;
pdispVal->AddRef ( );
return ( *this );
}
//
// Methods to work with GUIDs
//
CWsbVariant::CWsbVariant ( REFGUID rguid )
{
Init ( );
*this = rguid;
}
CWsbVariant & CWsbVariant::operator = ( REFGUID rguid )
{
Clear ( );
if ( 0 != ( bstrVal = WsbAllocStringLen( 0, WSB_GUID_STRING_SIZE ) ) ) {
if ( SUCCEEDED ( WsbStringFromGuid ( rguid, bstrVal ) ) ) {
vt = VT_BSTR;
}
}
return ( *this );
}
CWsbVariant::operator GUID ()
{
GUID guid;
WsbGuidFromString ( (const OLECHAR *)*this, &guid );
return guid;
}