//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: StgVar.hxx // // Contents: C++ wrapper for PROPVARIANT. // // History: 01-Aug-94 KyleP Created // //-------------------------------------------------------------------------- #if !defined(__STGVAR_HXX__) #define __STGVAR_HXX__ #include #include //+------------------------------------------------------------------------- // // Class: CStorageVariant // // Purpose: C++ wrapper for PROPVARIANT // // History: 01-Aug-94 KyleP Created // // Notes: A couple of variant arms are not implemented below. // VT_BSTR because its type signature is identical to that of // VT_LPSTR. VT_SAFEARRAY because I don't fully understand the // structure. // // Some types are duplicate base types with a different variant // tag. These include: // VARIANT_BOOL (short) // SCODE (long) // DATE (double) // We cannot create trivial constructors for the above because // of the type collision. You must use the Set methods. // // Some types will automatically coerce and cause confusion, // so they don't have constructors. You must use the Set // method. These include: // VT_UI2 // VT_UI4 // VT_UI8 // //-------------------------------------------------------------------------- class CCoTaskAllocator : public PMemoryAllocator { public: virtual void *Allocate(ULONG cbSize); virtual void Free(void *pv); }; #ifndef COTASKDECLSPEC #define COTASKDECLSPEC __declspec(dllimport) #endif COTASKDECLSPEC CCoTaskAllocator CoTaskAllocator; class CStorageVariant : public CAllocStorageVariant { public: // // Simple types // CStorageVariant() { vt = VT_EMPTY; } CStorageVariant(short i) { vt = VT_I2; iVal = i; } CStorageVariant(long l) { vt = VT_I4; lVal = l; } CStorageVariant(LARGE_INTEGER h) { vt = VT_I8; hVal = h; } CStorageVariant(float flt) { vt = VT_R4; fltVal = flt; } CStorageVariant(double dbl) { vt = VT_R8; dblVal = dbl; } CStorageVariant(CY cy) { vt = VT_CY; cyVal = cy; } CStorageVariant(FILETIME ft) { vt = VT_FILETIME; filetime = ft; } inline CStorageVariant & operator =(CStorageVariant const &var); inline CStorageVariant & operator =(short i); inline CStorageVariant & operator =(USHORT ui); inline CStorageVariant & operator =(long l); inline CStorageVariant & operator =(ULONG ul); inline CStorageVariant & operator =(LARGE_INTEGER h); inline CStorageVariant & operator =(ULARGE_INTEGER uh); inline CStorageVariant & operator =(float flt); inline CStorageVariant & operator =(double dbl); inline CStorageVariant & operator =(CY cy); inline CStorageVariant & operator =(FILETIME ft); // // Types with indirection // CStorageVariant(BLOB b); CStorageVariant(BYTE *pb, ULONG cb); CStorageVariant(char const *psz); CStorageVariant(WCHAR const *pwsz); CStorageVariant(CLSID const *pcid); inline CStorageVariant & operator =(BLOB b); inline CStorageVariant & operator =(char const *psz); inline CStorageVariant & operator =(WCHAR const *pwsz); inline CStorageVariant & operator =(CLSID const *pcid); // // Interface types // CStorageVariant(IStream *pstr); CStorageVariant(IStorage *pstor); // // Counted array types. Elements initially zeroed. Use Set/Get/Size // for access. // CStorageVariant(VARENUM vt, ULONG cElements); // // To/From C style PROPVARIANT and copy constructor // inline CStorageVariant(CStorageVariant const &var); CStorageVariant(PROPVARIANT &var); // // Destructor // ~CStorageVariant(); // // Memory allocation. Uses CoTaskAllocator // inline void *operator new(size_t size); inline void operator delete(void *p); inline void *operator new(size_t size, void *p); #if _MSC_VER >= 1200 inline void operator delete(void *p, void *pp); #endif // // Serialization // CStorageVariant(PDeSerStream &stm); // // Set/Get, all types including arrays. // inline void SetEMPTY(); inline void SetNULL(); inline void SetI1(CHAR i); inline void SetUI1(BYTE i); inline void SetI2(short i); inline void SetUI2(USHORT ui); inline void SetI4(long l); inline void SetUI4(ULONG ul); inline void SetR4(float f); inline void SetR8(double d); inline void SetI8(LARGE_INTEGER li); inline void SetUI8(ULARGE_INTEGER uli); inline void SetBOOL(VARIANT_BOOL b); inline void SetERROR(SCODE sc); inline void SetCY(CY cy); inline void SetDATE(DATE d); inline void SetFILETIME(FILETIME ft); inline void SetBSTR(BSTR b); // void SetSAFEARRAY(SAFEARRAY &sa); // SAFEARRAY GetSAFEARRAY(); inline void SetLPSTR(char const *psz); inline void SetLPWSTR(WCHAR const *pwsz); inline void SetBLOB(BLOB b); inline void SetSTREAM(IStream *ps); inline void SetSTREAMED_OBJECT(IStream *ps); inline void SetSTORAGE(IStorage *ps); inline void SetSTORED_OBJECT(IStorage *ps); inline void SetCLSID(CLSID const *pc); // // Array access // void SetI1(CHAR i, unsigned pos); void SetUI1(BYTE i, unsigned pos); void SetI2(short i, unsigned pos); void SetUI2(USHORT ui, unsigned pos); void SetI4(long l, unsigned pos); void SetUI4(ULONG ul, unsigned pos); void SetI8(LARGE_INTEGER li, unsigned pos); void SetUI8(ULARGE_INTEGER uli, unsigned pos); void SetR4(float f, unsigned pos); void SetR8(double d, unsigned pos); void SetBOOL(VARIANT_BOOL b, unsigned pos); void SetERROR(SCODE sc, unsigned pos); void SetCY(CY c, unsigned pos); void SetDATE(DATE d, unsigned pos); void SetBSTR(BSTR b, unsigned pos); // void SetVARIANT(CStorageVariant var, unsigned pos); // CStorageVariant GetVARIANT(unsigned pos) const; void SetLPSTR(char const *psz, unsigned pos); void SetLPWSTR(WCHAR const *pwsz, unsigned pos); void SetFILETIME(FILETIME f, unsigned pos); void SetCLSID(CLSID c, unsigned pos); }; inline CStorageVariant::CStorageVariant(BYTE *pb, ULONG cb) : CAllocStorageVariant(pb, cb, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(char const *psz) : CAllocStorageVariant(psz, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(WCHAR const *pwsz) : CAllocStorageVariant(pwsz, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(CLSID const *pcid) : CAllocStorageVariant(pcid, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(VARENUM v, ULONG cElements) : CAllocStorageVariant(v, cElements, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(PROPVARIANT &var) : CAllocStorageVariant(var, CoTaskAllocator) { } inline CStorageVariant::CStorageVariant(PDeSerStream &MemDeSerStream) : CAllocStorageVariant(MemDeSerStream, CoTaskAllocator) { } inline CStorageVariant::~CStorageVariant() { ResetType(CoTaskAllocator); } inline void CStorageVariant::SetEMPTY() { CAllocStorageVariant::SetEMPTY(CoTaskAllocator); } inline void CStorageVariant::SetNULL() { CAllocStorageVariant::SetNULL(CoTaskAllocator); } inline void CStorageVariant::SetI1(CHAR c) { CAllocStorageVariant::SetI1(c, CoTaskAllocator); } inline void CStorageVariant::SetUI1(BYTE b) { CAllocStorageVariant::SetUI1(b, CoTaskAllocator); } inline void CStorageVariant::SetI2(short i) { CAllocStorageVariant::SetI2(i, CoTaskAllocator); } inline void CStorageVariant::SetUI2(USHORT ui) { CAllocStorageVariant::SetUI2(ui, CoTaskAllocator); } inline void CStorageVariant::SetI4(long l) { CAllocStorageVariant::SetI4(l, CoTaskAllocator); } inline void CStorageVariant::SetUI4(ULONG ul) { CAllocStorageVariant::SetUI4(ul, CoTaskAllocator); } inline void CStorageVariant::SetR4(float f) { CAllocStorageVariant::SetR4(f, CoTaskAllocator); } inline void CStorageVariant::SetR8(double d) { CAllocStorageVariant::SetR8(d, CoTaskAllocator); } inline void CStorageVariant::SetI8(LARGE_INTEGER li) { CAllocStorageVariant::SetI8(li, CoTaskAllocator); } inline void CStorageVariant::SetUI8(ULARGE_INTEGER uli) { CAllocStorageVariant::SetUI8(uli, CoTaskAllocator); } inline void CStorageVariant::SetBOOL(VARIANT_BOOL b) { CAllocStorageVariant::SetBOOL(b, CoTaskAllocator); } inline void CStorageVariant::SetERROR(SCODE sc) { CAllocStorageVariant::SetERROR(sc, CoTaskAllocator); } inline void CStorageVariant::SetCY(CY cy) { CAllocStorageVariant::SetCY(cy, CoTaskAllocator); } inline void CStorageVariant::SetDATE(DATE d) { CAllocStorageVariant::SetDATE(d, CoTaskAllocator); } inline void CStorageVariant::SetFILETIME(FILETIME ft) { CAllocStorageVariant::SetFILETIME(ft, CoTaskAllocator); } inline void CStorageVariant::SetSTREAM(IStream *ps) { CAllocStorageVariant::SetSTREAM(ps, CoTaskAllocator); } inline void CStorageVariant::SetSTREAMED_OBJECT(IStream *ps) { CAllocStorageVariant::SetSTREAMED_OBJECT(ps, CoTaskAllocator); } inline void CStorageVariant::SetSTORAGE(IStorage *ps) { CAllocStorageVariant::SetSTORAGE(ps, CoTaskAllocator); } inline void CStorageVariant::SetSTORED_OBJECT(IStorage *ps) { CAllocStorageVariant::SetSTORED_OBJECT(ps, CoTaskAllocator); } inline void CStorageVariant::SetCLSID(CLSID const *pc) { CAllocStorageVariant::SetCLSID(pc, CoTaskAllocator); } inline CStorageVariant & CStorageVariant::operator =(CStorageVariant const &var) { ResetType(CoTaskAllocator); new (this) CStorageVariant((PROPVARIANT &) var); return(*this); } inline CStorageVariant & CStorageVariant::operator =(short i) { CAllocStorageVariant::SetI2(i, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(USHORT ui) { CAllocStorageVariant::SetUI2(ui, CoTaskAllocator); return(*this); } inline void CStorageVariant::SetBSTR(BSTR b) { CAllocStorageVariant::SetBSTR( b, CoTaskAllocator ); } inline void CStorageVariant::SetLPSTR(char const *psz) { CAllocStorageVariant::SetLPSTR(psz, CoTaskAllocator); } inline void CStorageVariant::SetLPWSTR(WCHAR const *pwsz) { CAllocStorageVariant::SetLPWSTR(pwsz, CoTaskAllocator); } inline void CStorageVariant::SetBLOB(BLOB b) { CAllocStorageVariant::SetBLOB(b, CoTaskAllocator); } inline CStorageVariant & CStorageVariant::operator =(long l) { CAllocStorageVariant::SetI4(l, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(ULONG ul) { CAllocStorageVariant::SetUI4(ul, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(LARGE_INTEGER h) { CAllocStorageVariant::SetI8(h, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(ULARGE_INTEGER uh) { CAllocStorageVariant::SetUI8(uh, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(float flt) { CAllocStorageVariant::SetR4(flt, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(double dbl) { CAllocStorageVariant::SetR8(dbl, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(CY cy) { CAllocStorageVariant::SetCY(cy, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(FILETIME ft) { CAllocStorageVariant::SetFILETIME(ft, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(BLOB b) { CAllocStorageVariant::SetBLOB(b, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(char const *psz) { CAllocStorageVariant::SetLPSTR(psz, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(WCHAR const *pwsz) { CAllocStorageVariant::SetLPWSTR(pwsz, CoTaskAllocator); return(*this); } inline CStorageVariant & CStorageVariant::operator =(CLSID const *pcid) { CAllocStorageVariant::SetCLSID(pcid, CoTaskAllocator); return(*this); } inline void * CStorageVariant::operator new(size_t size) { void *p = CoTaskMemAlloc(size); return(p); } inline void * CStorageVariant::operator new(size_t size, void *p) { return(p); } inline void CStorageVariant::operator delete(void *p) { if (p != NULL) { CoTaskMemFree(p); } } #if _MSC_VER >= 1200 inline void CStorageVariant::operator delete(void *p, void *pp) { return; } #endif inline CStorageVariant::CStorageVariant(CStorageVariant const &var) { new (this) CStorageVariant((PROPVARIANT &) var); } #endif // __STGVAR_HXX__