1// Windows/PropVariant.h
2
3#ifndef __WINDOWS_PROP_VARIANT_H
4#define __WINDOWS_PROP_VARIANT_H
5
6#include "../Common/MyTypes.h"
7#include "../Common/MyWindows.h"
8
9namespace NWindows {
10namespace NCOM {
11
12HRESULT PropVariant_Clear(PROPVARIANT *p) throw();
13
14HRESULT PropVarEm_Alloc_Bstr(PROPVARIANT *p, unsigned numChars) throw();
15HRESULT PropVarEm_Set_Str(PROPVARIANT *p, const char *s) throw();
16
17inline void PropVarEm_Set_UInt32(PROPVARIANT *p, UInt32 v) throw()
18{
19  p->vt = VT_UI4;
20  p->ulVal = v;
21}
22
23inline void PropVarEm_Set_UInt64(PROPVARIANT *p, UInt64 v) throw()
24{
25  p->vt = VT_UI8;
26  p->uhVal.QuadPart = v;
27}
28
29inline void PropVarEm_Set_FileTime64(PROPVARIANT *p, UInt64 v) throw()
30{
31  p->vt = VT_FILETIME;
32  p->filetime.dwLowDateTime = (DWORD)v;
33  p->filetime.dwHighDateTime = (DWORD)(v >> 32);
34}
35
36inline void PropVarEm_Set_Bool(PROPVARIANT *p, bool b) throw()
37{
38  p->vt = VT_BOOL;
39  p->boolVal = (b ? VARIANT_TRUE : VARIANT_FALSE);
40}
41
42
43class CPropVariant : public tagPROPVARIANT
44{
45public:
46  CPropVariant()
47  {
48    vt = VT_EMPTY;
49    wReserved1 = 0;
50    // wReserved2 = 0;
51    // wReserved3 = 0;
52    // uhVal.QuadPart = 0;
53    bstrVal = 0;
54  }
55  ~CPropVariant() throw() { Clear(); }
56  CPropVariant(const PROPVARIANT &varSrc);
57  CPropVariant(const CPropVariant &varSrc);
58  CPropVariant(BSTR bstrSrc);
59  CPropVariant(LPCOLESTR lpszSrc);
60  CPropVariant(bool bSrc) { vt = VT_BOOL; wReserved1 = 0; boolVal = (bSrc ? VARIANT_TRUE : VARIANT_FALSE); };
61  CPropVariant(Byte value) { vt = VT_UI1; wReserved1 = 0; bVal = value; }
62
63private:
64  CPropVariant(Int16 value); // { vt = VT_I2; wReserved1 = 0; iVal = value; }
65  CPropVariant(Int32 value); // { vt = VT_I4; wReserved1 = 0; lVal = value; }
66
67public:
68  CPropVariant(UInt32 value) { vt = VT_UI4; wReserved1 = 0; ulVal = value; }
69  CPropVariant(UInt64 value) { vt = VT_UI8; wReserved1 = 0; uhVal.QuadPart = value; }
70  CPropVariant(Int64 value) { vt = VT_I8; wReserved1 = 0; hVal.QuadPart = value; }
71  CPropVariant(const FILETIME &value) { vt = VT_FILETIME; wReserved1 = 0; filetime = value; }
72
73  CPropVariant& operator=(const CPropVariant &varSrc);
74  CPropVariant& operator=(const PROPVARIANT &varSrc);
75  CPropVariant& operator=(BSTR bstrSrc);
76  CPropVariant& operator=(LPCOLESTR lpszSrc);
77  CPropVariant& operator=(const char *s);
78
79  CPropVariant& operator=(bool bSrc) throw();
80  CPropVariant& operator=(Byte value) throw();
81
82private:
83  CPropVariant& operator=(Int16 value) throw();
84
85public:
86  CPropVariant& operator=(Int32 value) throw();
87  CPropVariant& operator=(UInt32 value) throw();
88  CPropVariant& operator=(UInt64 value) throw();
89  CPropVariant& operator=(Int64 value) throw();
90  CPropVariant& operator=(const FILETIME &value) throw();
91
92  BSTR AllocBstr(unsigned numChars);
93
94  HRESULT Clear() throw();
95  HRESULT Copy(const PROPVARIANT *pSrc) throw();
96  HRESULT Attach(PROPVARIANT *pSrc) throw();
97  HRESULT Detach(PROPVARIANT *pDest) throw();
98
99  HRESULT InternalClear() throw();
100  void InternalCopy(const PROPVARIANT *pSrc);
101
102  int Compare(const CPropVariant &a) throw();
103};
104
105}}
106
107#endif
108