1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// Windows/PropVariant.cpp 2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h" 4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "../Common/Defs.h" 6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "PropVariant.h" 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 9baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NWindows { 10baa3858d3f5d128a5c8466b700098109edcad5f2repo syncnamespace NCOM { 11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw() 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->bstrVal = ::SysAllocStringLen(0, numChars); 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!p->bstrVal) 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->vt = VT_ERROR; 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->scode = E_OUTOFMEMORY; 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return E_OUTOFMEMORY; 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->vt = VT_BSTR; 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return S_OK; 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw() 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky UINT len = (UINT)strlen(s); 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->bstrVal = ::SysAllocStringLen(0, len); 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!p->bstrVal) 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->vt = VT_ERROR; 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->scode = E_OUTOFMEMORY; 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return E_OUTOFMEMORY; 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky p->vt = VT_BSTR; 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky BSTR dest = p->bstrVal; 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (UINT i = 0; i <= len; i++) 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky dest[i] = s[i]; 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return S_OK; 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 42baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(const PROPVARIANT &varSrc) 43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_EMPTY; 45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalCopy(&varSrc); 46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 48baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(const CPropVariant &varSrc) 49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_EMPTY; 51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalCopy(&varSrc); 52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 54baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(BSTR bstrSrc) 55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_EMPTY; 57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *this = bstrSrc; 58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 60baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant::CPropVariant(LPCOLESTR lpszSrc) 61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_EMPTY; 63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *this = lpszSrc; 64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 66baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const CPropVariant &varSrc) 67baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalCopy(&varSrc); 69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 71baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const PROPVARIANT &varSrc) 72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalCopy(&varSrc); 74baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 75baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 76baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 77baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(BSTR bstrSrc) 78baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 79baa3858d3f5d128a5c8466b700098109edcad5f2repo sync *this = (LPCOLESTR)bstrSrc; 80baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 81baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 82baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 83baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const char *kMemException = "out of memory"; 84baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 85baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc) 86baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 87baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalClear(); 88baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_BSTR; 89baa3858d3f5d128a5c8466b700098109edcad5f2repo sync wReserved1 = 0; 90baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bstrVal = ::SysAllocString(lpszSrc); 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!bstrVal && lpszSrc) 92baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 93baa3858d3f5d128a5c8466b700098109edcad5f2repo sync throw kMemException; 94baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // vt = VT_ERROR; 95baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // scode = E_OUTOFMEMORY; 96baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 97baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 98baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 99baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 100baa3858d3f5d128a5c8466b700098109edcad5f2repo syncCPropVariant& CPropVariant::operator=(const char *s) 101baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 102baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalClear(); 103baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_BSTR; 104baa3858d3f5d128a5c8466b700098109edcad5f2repo sync wReserved1 = 0; 105baa3858d3f5d128a5c8466b700098109edcad5f2repo sync UINT len = (UINT)strlen(s); 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bstrVal = ::SysAllocStringLen(0, len); 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!bstrVal) 108baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 109baa3858d3f5d128a5c8466b700098109edcad5f2repo sync throw kMemException; 110baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // vt = VT_ERROR; 111baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // scode = E_OUTOFMEMORY; 112baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 113baa3858d3f5d128a5c8466b700098109edcad5f2repo sync else 114baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 115baa3858d3f5d128a5c8466b700098109edcad5f2repo sync for (UINT i = 0; i <= len; i++) 116baa3858d3f5d128a5c8466b700098109edcad5f2repo sync bstrVal[i] = s[i]; 117baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 118baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 119baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 120baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyCPropVariant& CPropVariant::operator=(bool bSrc) throw() 122baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 123baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (vt != VT_BOOL) 124baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 125baa3858d3f5d128a5c8466b700098109edcad5f2repo sync InternalClear(); 126baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_BOOL; 127baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 128baa3858d3f5d128a5c8466b700098109edcad5f2repo sync boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE; 129baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return *this; 130baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 131baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyBSTR CPropVariant::AllocBstr(unsigned numChars) 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (vt != VT_EMPTY) 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky InternalClear(); 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky vt = VT_BSTR; 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wReserved1 = 0; 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky bstrVal = ::SysAllocStringLen(0, numChars); 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!bstrVal) 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky throw kMemException; 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // vt = VT_ERROR; 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // scode = E_OUTOFMEMORY; 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return bstrVal; 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 148baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#define SET_PROP_FUNC(type, id, dest) \ 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CPropVariant& CPropVariant::operator=(type value) throw() \ 150baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { if (vt != id) { InternalClear(); vt = id; } \ 151baa3858d3f5d128a5c8466b700098109edcad5f2repo sync dest = value; return *this; } 152baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 153baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(Byte, VT_UI1, bVal) 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// SET_PROP_FUNC(Int16, VT_I2, iVal) 155baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(Int32, VT_I4, lVal) 156baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(UInt32, VT_UI4, ulVal) 157baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(UInt64, VT_UI8, uhVal.QuadPart) 158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckySET_PROP_FUNC(Int64, VT_I8, hVal.QuadPart) 159baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime) 160baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT PropVariant_Clear(PROPVARIANT *prop) throw() 162baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky switch (prop->vt) 164baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case VT_EMPTY: 166baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI1: 167baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I1: 168baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I2: 169baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI2: 170baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_BOOL: 171baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I4: 172baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI4: 173baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_R4: 174baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_INT: 175baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UINT: 176baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_ERROR: 177baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_FILETIME: 178baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI8: 179baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_R8: 180baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_CY: 181baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_DATE: 182baa3858d3f5d128a5c8466b700098109edcad5f2repo sync prop->vt = VT_EMPTY; 183baa3858d3f5d128a5c8466b700098109edcad5f2repo sync prop->wReserved1 = 0; 184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky prop->wReserved2 = 0; 185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky prop->wReserved3 = 0; 186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky prop->uhVal.QuadPart = 0; 187baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 188baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 189baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::VariantClear((VARIANTARG *)prop); 190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // return ::PropVariantClear(prop); 191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // PropVariantClear can clear VT_BLOB. 192baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 193baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Clear() throw() 195baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (vt == VT_EMPTY) 197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return S_OK; 198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return PropVariant_Clear(this); 199baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 200baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Copy(const PROPVARIANT* pSrc) throw() 202baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 203baa3858d3f5d128a5c8466b700098109edcad5f2repo sync ::VariantClear((tagVARIANT *)this); 204baa3858d3f5d128a5c8466b700098109edcad5f2repo sync switch(pSrc->vt) 205baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 206baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI1: 207baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I1: 208baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I2: 209baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI2: 210baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_BOOL: 211baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I4: 212baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI4: 213baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_R4: 214baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_INT: 215baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UINT: 216baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_ERROR: 217baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_FILETIME: 218baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI8: 219baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_R8: 220baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_CY: 221baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_DATE: 222baa3858d3f5d128a5c8466b700098109edcad5f2repo sync memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT)); 223baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 224baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 225baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)const_cast<PROPVARIANT *>(pSrc)); 226baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 227baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 228baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Attach(PROPVARIANT *pSrc) throw() 230baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 231baa3858d3f5d128a5c8466b700098109edcad5f2repo sync HRESULT hr = Clear(); 232baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (FAILED(hr)) 233baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return hr; 234baa3858d3f5d128a5c8466b700098109edcad5f2repo sync memcpy(this, pSrc, sizeof(PROPVARIANT)); 235baa3858d3f5d128a5c8466b700098109edcad5f2repo sync pSrc->vt = VT_EMPTY; 236baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 237baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 238baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::Detach(PROPVARIANT *pDest) throw() 240baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (pDest->vt != VT_EMPTY) 242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky HRESULT hr = PropVariant_Clear(pDest); 244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (FAILED(hr)) 245cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return hr; 246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 247baa3858d3f5d128a5c8466b700098109edcad5f2repo sync memcpy(pDest, this, sizeof(PROPVARIANT)); 248baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_EMPTY; 249baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return S_OK; 250baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 251baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 252cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyHRESULT CPropVariant::InternalClear() throw() 253baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 254cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (vt == VT_EMPTY) 255cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return S_OK; 256baa3858d3f5d128a5c8466b700098109edcad5f2repo sync HRESULT hr = Clear(); 257baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (FAILED(hr)) 258baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 259baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_ERROR; 260baa3858d3f5d128a5c8466b700098109edcad5f2repo sync scode = hr; 261baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 262baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return hr; 263baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 264baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 265baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid CPropVariant::InternalCopy(const PROPVARIANT *pSrc) 266baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 267baa3858d3f5d128a5c8466b700098109edcad5f2repo sync HRESULT hr = Copy(pSrc); 268baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (FAILED(hr)) 269baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 270baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (hr == E_OUTOFMEMORY) 271baa3858d3f5d128a5c8466b700098109edcad5f2repo sync throw kMemException; 272baa3858d3f5d128a5c8466b700098109edcad5f2repo sync vt = VT_ERROR; 273baa3858d3f5d128a5c8466b700098109edcad5f2repo sync scode = hr; 274baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 275baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 276baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 277cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CPropVariant::Compare(const CPropVariant &a) throw() 278baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{ 279baa3858d3f5d128a5c8466b700098109edcad5f2repo sync if (vt != a.vt) 280baa3858d3f5d128a5c8466b700098109edcad5f2repo sync return MyCompare(vt, a.vt); 281baa3858d3f5d128a5c8466b700098109edcad5f2repo sync switch (vt) 282baa3858d3f5d128a5c8466b700098109edcad5f2repo sync { 283baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_EMPTY: return 0; 284baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // case VT_I1: return MyCompare(cVal, a.cVal); 285baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI1: return MyCompare(bVal, a.bVal); 286baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I2: return MyCompare(iVal, a.iVal); 287baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI2: return MyCompare(uiVal, a.uiVal); 288baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I4: return MyCompare(lVal, a.lVal); 289baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI4: return MyCompare(ulVal, a.ulVal); 290baa3858d3f5d128a5c8466b700098109edcad5f2repo sync // case VT_UINT: return MyCompare(uintVal, a.uintVal); 291baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_I8: return MyCompare(hVal.QuadPart, a.hVal.QuadPart); 292baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_UI8: return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart); 293baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_BOOL: return -MyCompare(boolVal, a.boolVal); 294baa3858d3f5d128a5c8466b700098109edcad5f2repo sync case VT_FILETIME: return ::CompareFileTime(&filetime, &a.filetime); 295cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky case VT_BSTR: return 0; // Not implemented 296baa3858d3f5d128a5c8466b700098109edcad5f2repo sync default: return 0; 297baa3858d3f5d128a5c8466b700098109edcad5f2repo sync } 298baa3858d3f5d128a5c8466b700098109edcad5f2repo sync} 299baa3858d3f5d128a5c8466b700098109edcad5f2repo sync 300baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}} 301