BYTEとCOleVariantの相互変換

2099 ワード

#include <Afxdisp.h>

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