BYTE 和 COleVariant 相互转换

本文介绍如何从COleVariant对象中获取二进制数据并存入BYTE指针数组,以及如何将BYTE指针数组中的二进制数据放入COleVariant对象中。通过具体的C++实现代码,展示了如何安全地访问和操作Variant类型的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

time_t是C/C++语言标准库中的时间类型,表示从格林威治时间1970年1月1日00:00:00到当前时间的秒数。CTime、SYSTEMTIME、COleDateTime、COleVariant是MFC中的时间类型,用于便捷地进行日期时间的操作。 下面是它们之间的互相转换代码及讲解: 1. time_t to CTime ```cpp time_t t = time(NULL); CTime time(t); ``` 这段代码将当前时间的time_t类型转换为CTime类型。CTime类型的构造函数可以接受time_t类型的参数,将其转换为CTime类型。 2. CTime to time_t ```cpp CTime time(2021, 10, 1, 0, 0, 0); time_t t = time.GetTime(); ``` 这段代码将指定时间的CTime类型转换为time_t类型。CTime类型的GetTime函数返回从格林威治时间1970年1月1日00:00:00到当前时间的秒数,即time_t类型。 3. SYSTEMTIME to CTime ```cpp SYSTEMTIME st; GetLocalTime(&st); CTime time(st); ``` 这段代码将当前时间的SYSTEMTIME类型转换为CTime类型。CTime类型的构造函数可以接受SYSTEMTIME类型的参数,将其转换为CTime类型。 4. CTime to SYSTEMTIME ```cpp CTime time(2021, 10, 1, 0, 0, 0); SYSTEMTIME st; time.GetAsSystemTime(st); ``` 这段代码将指定时间的CTime类型转换为SYSTEMTIME类型。CTime类型的GetAsSystemTime函数将CTime类型转换为SYSTEMTIME类型。 5. COleDateTime to CTime ```cpp COleDateTime dt; dt = COleDateTime::GetCurrentTime(); CTime time(dt.GetYear(), dt.GetMonth(), dt.GetDay(), dt.GetHour(), dt.GetMinute(), dt.GetSecond()); ``` 这段代码将当前时间的COleDateTime类型转换为CTime类型。COleDateTime类型的GetCurrentTime函数返回当前时间的COleDateTime类型,CTime类型的构造函数可以接受COleDateTime类型的参数,将其转换为CTime类型。 6. CTime to COleDateTime ```cpp CTime time(2021, 10, 1, 0, 0, 0); COleDateTime dt(time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond()); ``` 这段代码将指定时间的CTime类型转换为COleDateTime类型。COleDateTime类型的构造函数可以接受CTime类型的参数,将其转换为COleDateTime类型。 7. COleVariant to CTime ```cpp COleVariant var; var = COleDateTime::GetCurrentTime(); CTime time(var.date); ``` 这段代码将当前时间的COleVariant类型转换为CTime类型。COleVariant类型的构造函数可以接受COleDateTime类型的参数,将其转换COleVariant类型,CTime类型的构造函数可以接受DATE类型的参数,将其转换为CTime类型。 8. CTime to COleVariant ```cpp CTime time(2021, 10, 1, 0, 0, 0); COleVariant var(time); ``` 这段代码将指定时间的CTime类型转换COleVariant类型。COleVariant类型的构造函数可以接受CTime类型的参数,将其转换COleVariant类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值