Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
� 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; }
|