Environment: Configuration Files, INIs
–>
This class was written to make safearrays easy.
#ifndef _CFSAFEARVARIANT_ #define _CFSAFEARVARIANT_ /* *Author Frans Nagel *This class facilitates the use of the parray member of *CComVariant for storage of binary data. */ //Example of use: int main(int argc, char* argv[]) { char * szText= "this is the text and more"; CSafeArrayVariant vSafeAr(szText,25); //vSafeAr now is a blob (VT_UI1|VT_ARRAY) that can be used //for COM calls. char * szRead = (char*)vSafeAr; char * szExtra = szRead + 17; return 0; } class CSafeArrayVariant : public CComVariant { public: inline ~CSafeArrayVariant() { } inline void Clear() { if((vt & VT_ARRAY) && parray) { SafeArrayDestroy(parray); parray = 0; } } inline void ReadBytes(BYTE * pBytes,int nLength) { Clear(); vt = VT_ARRAY|VT_UI1; BYTE * pBytes2 = 0; m_nLength = (nLength > 0) ? nLength : 0; parray = SafeArrayCreateVector(VT_UI1,1,m_nLength + 1); SafeArrayAccessData(parray,(void**)&pBytes2); memcpy(pBytes2,pBytes,m_nLength); pBytes2[m_nLength] = 0; SafeArrayUnaccessData(parray); } inline void ReadBytes(char* szText,int nLength) { BYTE * pBytes = (BYTE*)szText; m_nLength = nLength; ReadBytes(pBytes,nLength); } inline operator += (CSafeArrayVariant &var) { int nAddedLength = var.GetLength(); if(nAddedLength) { int nNewLength = m_nLength + nAddedLength; BYTE * pBytes = (BYTE*)_alloca(nNewLength); if(m_nLength) memcpy(pBytes,(char*)(*this),m_nLength); memcpy(pBytes + m_nLength,(char*)var,nAddedLength); ReadBytes(pBytes,nNewLength); } } inline CSafeArrayVariant() { parray = 0; m_nLength = 0; } inline CSafeArrayVariant(char * szBytes,int nLength) { ReadBytes(szBytes,nLength); } inline CSafeArrayVariant(const CComVariant& var) { parray = 0; operator =(var); } inline operator = (VARIANT var) { m_nLength = 0; if(var.vt == (VT_ARRAY|VT_UI1)) { long lBound,uBound; SafeArrayGetLBound(var.parray,1,&lBound); SafeArrayGetUBound(var.parray,1,&uBound); m_nLength = uBound - lBound; } CComVariant::operator =(var); } inline int GetLength()const { return m_nLength; } inline operator char*() { //use GetLength() to make sure you read everything if(vt == (VT_ARRAY|VT_UI1)) { BYTE * pBytes = 0; long lBound,uBound; SafeArrayGetLBound(parray,1,&lBound); SafeArrayGetUBound(parray,1,&uBound); m_nLength = uBound - lBound; SafeArrayAccessData(parray,(void**)&pBytes); char * szVal = (char*)pBytes; SafeArrayUnaccessData(parray); return szVal; } USES_CONVERSION; return W2A(bstrVal); } protected: int m_nLength; }; #endif