1 // Windows/PropVariant.cpp
5 #include "PropVariant.h"
7 #include "../Common/Defs.h"
12 CPropVariant::CPropVariant(const PROPVARIANT& varSrc)
15 InternalCopy(&varSrc);
18 CPropVariant::CPropVariant(const CPropVariant& varSrc)
21 InternalCopy(&varSrc);
24 CPropVariant::CPropVariant(BSTR bstrSrc)
30 CPropVariant::CPropVariant(LPCOLESTR lpszSrc)
36 CPropVariant& CPropVariant::operator=(const CPropVariant& varSrc)
38 InternalCopy(&varSrc);
41 CPropVariant& CPropVariant::operator=(const PROPVARIANT& varSrc)
43 InternalCopy(&varSrc);
47 CPropVariant& CPropVariant::operator=(BSTR bstrSrc)
49 *this = (LPCOLESTR)bstrSrc;
53 CPropVariant& CPropVariant::operator=(LPCOLESTR lpszSrc)
58 bstrVal = ::SysAllocString(lpszSrc);
59 if (bstrVal == NULL && lpszSrc != NULL)
62 scode = E_OUTOFMEMORY;
68 CPropVariant& CPropVariant::operator=(bool bSrc)
75 boolVal = bSrc ? VARIANT_TRUE : VARIANT_FALSE;
79 CPropVariant& CPropVariant::operator=(UInt32 value)
90 CPropVariant& CPropVariant::operator=(UInt64 value)
97 uhVal.QuadPart = value;
101 CPropVariant& CPropVariant::operator=(const FILETIME &value)
103 if (vt != VT_FILETIME)
112 CPropVariant& CPropVariant::operator=(Int32 value)
124 CPropVariant& CPropVariant::operator=(Byte value)
135 CPropVariant& CPropVariant::operator=(Int16 value)
147 CPropVariant& CPropVariant::operator=(LONG value)
159 static HRESULT MyPropVariantClear(PROPVARIANT *propVariant)
161 switch(propVariant->vt)
179 propVariant->vt = VT_EMPTY;
180 propVariant->wReserved1 = 0;
183 return ::VariantClear((VARIANTARG *)propVariant);
186 HRESULT CPropVariant::Clear()
188 return MyPropVariantClear(this);
191 HRESULT CPropVariant::Copy(const PROPVARIANT* pSrc)
193 ::VariantClear((tagVARIANT *)this);
212 memmove((PROPVARIANT*)this, pSrc, sizeof(PROPVARIANT));
215 return ::VariantCopy((tagVARIANT *)this, (tagVARIANT *)(pSrc));
219 HRESULT CPropVariant::Attach(PROPVARIANT* pSrc)
221 HRESULT hr = Clear();
224 memcpy(this, pSrc, sizeof(PROPVARIANT));
229 HRESULT CPropVariant::Detach(PROPVARIANT* pDest)
231 HRESULT hr = MyPropVariantClear(pDest);
234 memcpy(pDest, this, sizeof(PROPVARIANT));
239 HRESULT CPropVariant::InternalClear()
241 HRESULT hr = Clear();
250 void CPropVariant::InternalCopy(const PROPVARIANT* pSrc)
252 HRESULT hr = Copy(pSrc);
260 int CPropVariant::Compare(const CPropVariant &a)
263 return 0; // it's mean some bug
271 return MyCompare(cVal, a.cVal);
274 return MyCompare(bVal, a.bVal);
277 return MyCompare(iVal, a.iVal);
279 return MyCompare(uiVal, a.uiVal);
282 return MyCompare(lVal, a.lVal);
285 return MyCompare(intVal, a.intVal);
288 return MyCompare(ulVal, a.ulVal);
291 return MyCompare(uintVal, a.uintVal);
294 return MyCompare(hVal.QuadPart, a.hVal.QuadPart);
296 return MyCompare(uhVal.QuadPart, a.uhVal.QuadPart);
299 return -MyCompare(boolVal, a.boolVal);
302 return ::CompareFileTime(&filetime, &a.filetime);
304 return 0; // Not implemented
305 // return MyCompare(aPropVarint.cVal);