Home > Win32/MFC > Write and read binary data in VARIANT

Write and read binary data in VARIANT

November 22nd, 2006

We offen need to store some binary data in the mdb database, thus we have to transefer the data by VARIANT structure.
But how to read from binary data from VARIANT or write to? Here is a solution by safe array of VARRIANT.

download: src.cpp
BOOL GetBinaryFromVariant(COleVariant & ovData, BYTE ** ppBufunsigned long * pcBufLen)
{   
 
BOOL fRetVal = FALSE;
 
//Binary data is stored in the variant as an array of unsigned char   
 
if(ovData.vt == (VT_ARRAY|VT_UI1))  // (OLE SAFEARRAY)   
 
{       
 
//Retrieve size of array       
  *
pcBufLen = ovData.parray->rgsabound[0].cElements;
  *
ppBuf = new BYTE[*pcBufLen]; //Allocate a buffer to store the data
 
if(*ppBuf != NULL)
 
{
  
void * pArrayData
  
//Obtain safe pointer to the array           
  
SafeArrayAccessData(ovData.parray,&pArrayData);
  
//Copy the bitmap into our buffer           
  
memcpy(*ppBuf, pArrayData, *pcBufLen)//Unlock the variant data           
  
SafeArrayUnaccessData(ovData.parray);           
  
fRetVal = TRUE;       
 
}   
 
}   
 
return fRetVal;
}

download: src.cpp
BOOL PutBinaryIntoVariant(COleVariant * ovData, BYTE * pBuf,unsigned long cBufLen)
{   
 
BOOL fRetVal = FALSE
 
VARIANT var;   
 
VariantInit(&var);     //Initialize our variant       
 
//Set the type to an array of unsigned chars (OLE SAFEARRAY)   
 
var.vt = VT_ARRAY | VT_UI1;       
 
//Set up the bounds structure   
 
SAFEARRAYBOUND  rgsabound[1];       
 
rgsabound[0].cElements = cBufLen;   
 
rgsabound[0].lLbound = 0;       
 
//Create an OLE SAFEARRAY   
 
var.parray = SafeArrayCreate(VT_UI1,1,rgsabound);       
 
if(var.parray != NULL)   
 
{       
 
void * pArrayData = NULL;
 
//Get a safe pointer to the array
 
SafeArrayAccessData(var.parray,&pArrayData);
 
//Copy data to it
 
memcpy(pArrayData, pBuf, cBufLen);
 
//Unlock the variant data
 
SafeArrayUnaccessData(var.parray);
  *
ovData = var;
 
// Create a COleVariant based on our variant 
 
VariantClear(&var);   
 
fRetVal = TRUE
 
}       
 
return fRetVal;
}

Win32/MFC , , , ,

  1. No comments yet.
  1. No trackbacks yet.