VC常用数据类型使用转换摘录2

来源:互联网 发布:通过mac地址发送消息 编辑:程序博客网 时间:2024/06/04 18:07

struct  tagVARIANT
    {
    union
        {
        struct  __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union
                {
                LONG lVal;      //这几个常用---->
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;     //<----
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;      //---->
                DATE date;      
                BSTR bstrVal;     //<----
                IUnknown __RPC_FAR *punkVal;
                IDispatch __RPC_FAR *pdispVal;
                SAFEARRAY __RPC_FAR *parray;
                BYTE __RPC_FAR *pbVal;
                SHORT __RPC_FAR *piVal;
                LONG __RPC_FAR *plVal;
                FLOAT __RPC_FAR *pfltVal;
                DOUBLE __RPC_FAR *pdblVal;
                VARIANT_BOOL __RPC_FAR *pboolVal;
                _VARIANT_BOOL __RPC_FAR *pbool;
                SCODE __RPC_FAR *pscode;
                CY __RPC_FAR *pcyVal;
                DATE __RPC_FAR *pdate;
                BSTR __RPC_FAR *pbstrVal;
                IUnknown __RPC_FAR *__RPC_FAR *ppunkVal;
                IDispatch __RPC_FAR *__RPC_FAR *ppdispVal;
                SAFEARRAY __RPC_FAR *__RPC_FAR *pparray;
                VARIANT __RPC_FAR *pvarVal;
                PVOID byref;
                CHAR cVal;        //---->
                USHORT uiVal;
                ULONG ulVal;
                INT intVal;
                UINT uintVal;       //<----
                DECIMAL __RPC_FAR *pdecVal;
                CHAR __RPC_FAR *pcVal;
                USHORT __RPC_FAR *puiVal;
                ULONG __RPC_FAR *pulVal;
                INT __RPC_FAR *pintVal;
                UINT __RPC_FAR *puintVal;
                struct  __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo __RPC_FAR *pRecInfo;
                    } __VARIANT_NAME_4;
                } __VARIANT_NAME_3;
            } __VARIANT_NAME_2;
        DECIMAL decVal;
        } __VARIANT_NAME_1;
    };

COleDateTime vartodate(const _variant_t& var)
{
 COleDateTime value;
 switch (var.vt)
 {
 case VT_DATE:
  {
   value = var.date;
  }
  break;
 case VT_EMPTY:
 case VT_NULL:
  value.SetStatus(COleDateTime::null);
  break;
 default:
  value.SetStatus(COleDateTime::null);
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 }
 return value;
}

COleCurrency vartocy(const _variant_t& var)
{
 COleCurrency value;
 switch (var.vt)
 {
 case VT_CY:
  value = (CURRENCY)var.cyVal;
  break;
 case VT_EMPTY:
 case VT_NULL:
  value.m_status = COleCurrency::null;
  break;
 default:
  value.m_status = COleCurrency::null;
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 }
 return value;
}

bool vartobool(const _variant_t& var)
{
 bool value = false;
 switch (var.vt)
 {
 case VT_BOOL:
  value = var.boolVal ? true : false;
 case VT_EMPTY:
 case VT_NULL:
  break;
 default:
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 }
 return value;
}

BYTE vartoby(const _variant_t& var)
{
 BYTE value = 0;
 switch (var.vt)
 {
 case VT_I1:
 case VT_UI1:
  value = var.bVal;
  break;
 case VT_NULL:
 case VT_EMPTY:
  value = 0;
  break;
 default:
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 } 
 return value;
}

short vartoi(const _variant_t& var)
{
 short value = 0;
 switch (var.vt)
 {
 case VT_BOOL:
  value = var.boolVal;
  break;
 case VT_UI1:
 case VT_I1:
  value = var.bVal;
  break;
 case VT_I2:
 case VT_UI2:
  value = var.iVal;
  break;
 case VT_NULL:
 case VT_EMPTY:
  value = 0;
  break;
 default:
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 } 
 return value;
}

long vartol(const _variant_t& var)
{
 long value = 0;
 switch (var.vt)
 {
 case VT_BOOL:
  value = var.boolVal;
  break;
 case VT_UI1:
 case VT_I1:
  value = var.bVal;
  break;
 case VT_UI2:
 case VT_I2:
  value = var.iVal;
  break;
 case VT_I4:
 case VT_UI4:
  value = var.lVal;
  break;
 case VT_INT:
  value = var.intVal;
  break;
 case VT_R4:
  value = (long)(var.fltVal + 0.5);
  break;
 case VT_R8:
  value = (long)(var.dblVal + 0.5);
  break;
 case VT_DECIMAL:
  value = (long)var;
  break;
 case VT_CY:
  value = (long)var;
  break;
 case VT_BSTR://字符串
 case VT_LPSTR://字符串
 case VT_LPWSTR://字符串
  value = atol((LPCTSTR)(_bstr_t)var);
  break;
 case VT_NULL:
 case VT_EMPTY:
  value = 0;
  break;
 default:
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 }
 return value;
}

double vartof(const _variant_t& var)
{
 double value = 0;
 switch (var.vt)
 {
 case VT_R4:
  value = var.fltVal;
  break;
 case VT_R8:
  value = var.dblVal;
  break;
 case VT_DECIMAL:
  value = (double)var;
  break;
 case VT_CY:
  value = (double)var;
  break;
 case VT_BOOL:
  value = var.boolVal;
  break;
 case VT_UI1:
 case VT_I1:
  value = var.bVal;
  break;
 case VT_UI2:
 case VT_I2:
  value = var.iVal;
  break;
 case VT_UI4:
 case VT_I4:
  value = var.lVal;
  break;
 case VT_INT:
  value = var.intVal;
  break;
 case VT_BSTR://字符串
 case VT_LPSTR://字符串
 case VT_LPWSTR://字符串
  value = atof((LPCTSTR)(_bstr_t)var);
  break;
 case VT_NULL:
 case VT_EMPTY:
  value = 0;
  break;
 default:
  value = 0;
  TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d/n"), __FILE__, __LINE__);
 }
 return value;
}

CString vartostr(const _variant_t &var)
{
 CString strValue;
 
 switch (var.vt)
 {
 case VT_BSTR://字符串
 case VT_LPSTR://字符串
 case VT_LPWSTR://字符串
  strValue = (LPCTSTR)(_bstr_t)var;
  break;
 case VT_I1:
 case VT_UI1:
  strValue.Format("%d", var.bVal);
  break;
 case VT_I2://短整型
  strValue.Format("%d", var.iVal);
  break;
 case VT_UI2://无符号短整型
  strValue.Format("%d", var.uiVal);
  break;
 case VT_INT://整型
  strValue.Format("%d", var.intVal);
  break;
 case VT_I4: //整型
  strValue.Format("%d", var.lVal);
  break;
 case VT_I8: //长整型
  strValue.Format("%d", var.lVal);
  break;
 case VT_UINT://无符号整型
  strValue.Format("%d", var.uintVal);
  break;
 case VT_UI4: //无符号整型
  strValue.Format("%d", var.ulVal);
  break;
 case VT_UI8: //无符号长整型
  strValue.Format("%d", var.ulVal);
  break;
 case VT_VOID:
  strValue.Format("%8x", var.byref);
  break;
 case VT_R4://浮点型
  strValue.Format("%.4f", var.fltVal);
  break;
 case VT_R8://双精度型
  strValue.Format("%.8f", var.dblVal);
  break;
 case VT_DECIMAL: //小数
  strValue.Format("%.8f", (double)var);
  break;
 case VT_CY:
  {
   COleCurrency cy = var.cyVal;
   strValue = cy.Format();
  }
  break;
 case VT_BLOB:
 case VT_BLOB_OBJECT:
 case 0x2011:
  strValue = "[BLOB]";
  break;
 case VT_BOOL://布尔型

  strValue = var.boolVal ? "TRUE" : "FALSE";
  break;
 case VT_DATE: //日期型
  {
   DATE dt = var.date;
   COleDateTime da = COleDateTime(dt);
   strValue = da.Format("%Y-%m-%d %H:%M:%S");
  }
  break;
 case VT_NULL://NULL值
  strValue = "";
  break;
 case VT_EMPTY://空
  strValue = "";
  break;
 case VT_UNKNOWN://未知类型
 default:
  strValue = "UN_KNOW";
  break;
 }
 return strValue;
}

 

原创粉丝点击