Microsoft KB Archive/152294

= How to extract binary data from a COleVariant data type and how to store binary data in a COleVariant data type =

Article ID: 152294

Article Last Modified on 6/2/2005

-

APPLIES TO


 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 4.2 Enterprise Edition
 * Microsoft Visual C++ 4.2 Enterprise Edition
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 4.2 Professional Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q152294



SUMMARY
When using the DAO SDK C++ classes to access binary data (such as a bitmap) you will find that the data is returned in a COleVariant. COleVariant is an MFC class that wraps the OLE VARIANT data type. Within the VARIANT, the data is stored as an OLE SAFEARRAY.

Extracting the binary data from the COleVariant requires some knowledge of VARIANTs and SAFEARRAYs. The sample code below illustrates how to work with these data types by providing a function for extracting binary data from a COleVariant and a function for storing binary data in a COleVariant.



Sample Code
//Extensive error checking is left out to make the code more readable

BOOL GetBinaryFromVariant(COleVariant & ovData, BYTE ** ppBuf,                               unsigned 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; }

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 bitmap 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; }

//How you might call these functions

CdbRecordset rs;

//Code for initializing DAO and opening the recordset left out...

COleVariant ovData = rs.GetField(_T("MyBinaryField"));

BYTE * pBuf = NULL; unsigned long cBufLen;

if(GetBinaryFromVariant(ovData,&pBuf,&cBufLen)) {    //Do something with binary data in pBuf...

//Write back a new record containing the binary data

COleVariant ovData2; if(PutBinaryIntoVariant(&ovData2,pBuf,cBufLen)) {      rs.AddNew; rs.SetField(_T("MyBinaryField"), ovData2); //Write our COleVariant to the table rs.Update; }    //Clean up memory allocated by GetBinaryFromVariant if(pBuf) delete pBuf; }

Additional query words: kbgrpMFCOLE

Keywords: kbhowto kbprogramming kbcode KB152294

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.