BYTE * ppBuf;
long pcBufLen;

CMemFile file(ppBuf,pcBufLen); 
CArchive ar(&file,CArchive::load);

 

下面是COleVariant与BYTE 转换:

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

posted on 2010-03-27 14:54  zfgis  阅读(728)  评论(0编辑  收藏  举报