|
|
class COleVariant; // OLE VARIANT wrapper
class COleDateTime; // Based on OLE DATE
class CLongBinary; // forward reference (see afxdb_.h)
/*
class COleCurrency; // Based on OLE CY
class COleDateTimeSpan; // Based on a double
class COleSafeArray; // Based on OLE VARIANT
*/ /////////////////////////////////////////////////////////////////////////////
// AFXDLL support
#undef AFX_DATA
#define AFX_DATA AFX_OLE_DATA
#include <delaydll.h>
// parameter types: by value VTs
#define VTS_I2 "\x02" // a 'short'
#define VTS_I4 "\x03" // a 'long'
#define VTS_R4 "\x04" // a 'float'
#define VTS_R8 "\x05" // a 'double'
#define VTS_CY "\x06" // a 'CY' or 'CY*'
#define VTS_DATE "\x07" // a 'DATE'
#define VTS_WBSTR "\x08" // an 'LPCOLESTR'
#define VTS_DISPATCH "\x09" // an 'IDispatch*'
#define VTS_SCODE "\x0A" // an 'SCODE'
#define VTS_BOOL "\x0B" // a 'BOOL'
#define VTS_VARIANT "\x0C" // a 'const VARIANT&' or 'VARIANT*'
#define VTS_UNKNOWN "\x0D" // an 'IUnknown*'
#if defined(_UNICODE) || defined(OLE2ANSI)
#define VTS_BSTR VTS_WBSTR// an 'LPCOLESTR'
#define VT_BSTRT VT_BSTR
#else
#define VTS_BSTR "\x0E" // an 'LPCSTR'
#define VT_BSTRA 14
#define VT_BSTRT VT_BSTRA
#endif
// parameter types: by reference VTs
#define VTS_PI2 "\x42" // a 'short*'
#define VTS_PI4 "\x43" // a 'long*'
#define VTS_PR4 "\x44" // a 'float*'
#define VTS_PR8 "\x45" // a 'double*'
#define VTS_PCY "\x46" // a 'CY*'
#define VTS_PDATE "\x47" // a 'DATE*'
#define VTS_PBSTR "\x48" // a 'BSTR*'
#define VTS_PDISPATCH "\x49" // an 'IDispatch**'
#define VTS_PSCODE "\x4A" // an 'SCODE*'
#define VTS_PBOOL "\x4B" // a 'VARIANT_BOOL*'
#define VTS_PVARIANT "\x4C" // a 'VARIANT*'
#define VTS_PUNKNOWN "\x4D" // an 'IUnknown**'
// special VT_ and VTS_ values
#define VTS_NONE NULL // used for members with 0 params
#define VT_MFCVALUE 0xFFF // special value for DISPID_VALUE
#define VT_MFCBYREF 0x40 // indicates VT_BYREF type
#define VT_MFCMARKER 0xFF // delimits named parameters (INTERNAL USE)
// variant handling (use V_BSTRT when you have ANSI BSTRs, as in DAO)
#ifndef _UNICODE
#define V_BSTRT(b) (LPSTR)V_BSTR(b)
#else
#define V_BSTRT(b) V_BSTR(b)
#endif
/////////////////////////////////////////////////////////////////////////////
// COleVariant class - wraps VARIANT types
typedef const VARIANT* LPCVARIANT;
class COleVariant : public tagVARIANT { // Constructors
public: COleVariant();
COleVariant(const VARIANT& varSrc); COleVariant(LPCVARIANT pSrc); COleVariant(const COleVariant& varSrc);
COleVariant(LPCTSTR lpszSrc); COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string
COleVariant(CString& strSrc);
COleVariant(BYTE nSrc); COleVariant(short nSrc, VARTYPE vtSrc = VT_I2); COleVariant(long lSrc, VARTYPE vtSrc = VT_I4); //COleVariant(const COleCurrency& curSrc);
COleVariant(float fltSrc); COleVariant(double dblSrc); COleVariant(const COleDateTime& timeSrc);
//COleVariant(const CByteArray& arrSrc);
COleVariant(const CLongBinary& lbSrc);
// Operations
public: void Clear(); void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL); void Attach(VARIANT& varSrc); VARIANT Detach();
BOOL operator==(const VARIANT& varSrc) const; BOOL operator==(LPCVARIANT pSrc) const;
const COleVariant& operator=(const VARIANT& varSrc); const COleVariant& operator=(LPCVARIANT pSrc); const COleVariant& operator=(const COleVariant& varSrc);
const COleVariant& operator=(const LPCTSTR lpszSrc); const COleVariant& operator=(const CString& strSrc);
const COleVariant& operator=(BYTE nSrc); const COleVariant& operator=(short nSrc); const COleVariant& operator=(long lSrc); //const COleVariant& operator=(const COleCurrency& curSrc);
const COleVariant& operator=(float fltSrc); const COleVariant& operator=(double dblSrc); const COleVariant& operator=(const COleDateTime& dateSrc);
//const COleVariant& operator=(const CByteArray& arrSrc);
const COleVariant& operator=(const CLongBinary& lbSrc);
void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string
HRESULT Save(IStream *pStm, BOOL fClearDirty = FALSE); HRESULT Load(IStream *pStm); //HRESULT GetSizeMax(ULARGE_INTEGER *pcbSize);
HRESULT GetSizeMax(ULONG *pcbSize);
operator LPVARIANT(); operator LPCVARIANT() const;
// Implementation
public: ~COleVariant(); };
// COleVariant diagnostics and serialization
#ifdef _DEBUG
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleVariant varSrc); #endif
//CArchive& AFXAPI operator<<(CArchive& ar, COleVariant varSrc);
//CArchive& AFXAPI operator>>(CArchive& ar, COleVariant& varSrc);
// Helper for initializing VARIANT structures
void AFXAPI AfxVariantInit(LPVARIANT pVar);
class COleSafeArray;
/////////////////////////////////////////////////////////////////////////////
// Helper for initializing COleSafeArray
void AFXAPI AfxSafeArrayInit(COleSafeArray* psa);
/////////////////////////////////////////////////////////////////////////////
// CSafeArray class
typedef const SAFEARRAY* LPCSAFEARRAY;
class COleSafeArray : public tagVARIANT { //Constructors
public: COleSafeArray(); COleSafeArray(const SAFEARRAY& saSrc, VARTYPE vtSrc); COleSafeArray(LPCSAFEARRAY pSrc, VARTYPE vtSrc); COleSafeArray(const COleSafeArray& saSrc); COleSafeArray(const VARIANT& varSrc); COleSafeArray(LPCVARIANT pSrc); COleSafeArray(const COleVariant& varSrc);
// Operations
public: void Clear(); void Attach(VARIANT& varSrc); VARIANT Detach();
COleSafeArray& operator=(const COleSafeArray& saSrc); COleSafeArray& operator=(const VARIANT& varSrc); COleSafeArray& operator=(LPCVARIANT pSrc); COleSafeArray& operator=(const COleVariant& varSrc);
BOOL operator==(const SAFEARRAY& saSrc) const; BOOL operator==(LPCSAFEARRAY pSrc) const; BOOL operator==(const COleSafeArray& saSrc) const; BOOL operator==(const VARIANT& varSrc) const; BOOL operator==(LPCVARIANT pSrc) const; BOOL operator==(const COleVariant& varSrc) const;
operator LPVARIANT(); operator LPCVARIANT() const;
// One dim array helpers
void CreateOneDim(VARTYPE vtSrc, DWORD dwElements, void* pvSrcData = NULL, long nLBound = 0); DWORD GetOneDimSize(); void ResizeOneDim(DWORD dwElements);
// Multi dim array helpers
void Create(VARTYPE vtSrc, DWORD dwDims, DWORD* rgElements);
// SafeArray wrapper classes
void Create(VARTYPE vtSrc, DWORD dwDims, SAFEARRAYBOUND* rgsabounds); void AccessData(void** ppvData); void UnaccessData(); void AllocData(); void AllocDescriptor(DWORD dwDims); void Copy(LPSAFEARRAY* ppsa); void GetLBound(DWORD dwDim, long* pLBound); void GetUBound(DWORD dwDim, long* pUBound); void GetElement(long* rgIndices, void* pvData); void PtrOfIndex(long* rgIndices, void** ppvData); void PutElement(long* rgIndices, void* pvData); void Redim(SAFEARRAYBOUND* psaboundNew); void Lock(); void Unlock(); DWORD GetDim(); DWORD GetElemSize(); void Destroy(); void DestroyData(); void DestroyDescriptor();
//Implementation
public: ~COleSafeArray();
// Cache info to make element access (operator []) faster
DWORD m_dwElementSize; DWORD m_dwDims; };
// COleSafeArray diagnostics and serialization
#ifdef _DEBUG
CDumpContext& AFXAPI operator<<(CDumpContext& dc, COleSafeArray saSrc); #endif
//CArchive& AFXAPI operator<<(CArchive& ar, COleSafeArray saSrc);
//CArchive& AFXAPI operator>>(CArchive& ar, COleSafeArray& saSrc);
#define _AFXDISP_INLINE inline
#ifdef _AFX_INLINE
// COleVariant
_AFXDISP_INLINE COleVariant::COleVariant() { AfxVariantInit(this); } _AFXDISP_INLINE COleVariant::~COleVariant() { ::VariantClear(this); } _AFXDISP_INLINE COleVariant::COleVariant(LPCTSTR lpszSrc) { vt = VT_EMPTY; *this = lpszSrc; } _AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc) { vt = VT_EMPTY; *this = strSrc; } _AFXDISP_INLINE COleVariant::COleVariant(BYTE nSrc) { vt = VT_UI1; bVal = nSrc; } //_AFXDISP_INLINE COleVariant::COleVariant(const COleCurrency& curSrc)
// { vt = VT_CY; cyVal = curSrc.m_cur; }
_AFXDISP_INLINE COleVariant::COleVariant(float fltSrc) { vt = VT_R4; fltVal = fltSrc; } _AFXDISP_INLINE COleVariant::COleVariant(double dblSrc) { vt = VT_R8; dblVal = dblSrc; } //_AFXDISP_INLINE COleVariant::COleVariant(const COleDateTime& dateSrc)
// { vt = VT_DATE; date = dateSrc.m_dt; }
//_AFXDISP_INLINE COleVariant::COleVariant(const CByteArray& arrSrc)
// { vt = VT_EMPTY; *this = arrSrc; }
_AFXDISP_INLINE COleVariant::COleVariant(const CLongBinary& lbSrc) { vt = VT_EMPTY; *this = lbSrc; } _AFXDISP_INLINE BOOL COleVariant::operator==(LPCVARIANT pSrc) const { return *this == *pSrc; } _AFXDISP_INLINE COleVariant::operator LPVARIANT() { return this; } _AFXDISP_INLINE COleVariant::operator LPCVARIANT() const { return this; }
#endif //_AFX_INLINE
/*
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations
#ifdef _AFX_PACKING
#pragma pack(pop)
#endif
#ifdef _AFX_ENABLE_INLINES
#define _AFXDISP_INLINE inline
//#include <afxole.inl>
#undef _AFXDISP_INLINE
#endif
#undef AFX_DATA
#define AFX_DATA
#ifdef _AFX_MINREBUILD
#pragma component(minrebuild, on)
#endif
#ifndef _AFX_FULLTYPEINFO
#pragma component(mintypeinfo, off)
#endif
*/
/////////////////////////////////////////////////////////////////////////////
|