VARIANT类型的两个转换函数

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
下面是摘自MSDN的两个函数: 
1、ConvertVarTypeToString —— 将Variant类型转换为字符串
2、ConvertValueToString —— 将Variant值转换为字符串
在查看Variant值方面很有用处。

// +-------------------------------------------------------------------
//
//   ConvertVarTypeToString
//   
//   Generate a string for a given PROPVARIANT variable type (VT). 
//   For the given vt, write the string to pwszType, which is a buffer
//   of size cchType characters.
//
// +-------------------------------------------------------------------

void
ConvertVarTypeToString( VARTYPE vt, WCHAR 
* pwszType, ULONG cchType )
{
    
const WCHAR *pwszModifier;

    
// Ensure that the output string is terminated
    
// (wcsncpy does not guarantee termination)

    pwszType[ cchType
-1 ] = L'';
    
--cchType;

    
// Create a string using the basic type.

    
switch( vt & VT_TYPEMASK )
    
{
    
case VT_EMPTY:
        wcsncpy( pwszType, L
"VT_EMPTY", cchType );
        
break;
    
case VT_NULL:
        wcsncpy( pwszType, L
"VT_NULL", cchType );
        
break;
    
case VT_I2:
        wcsncpy( pwszType, L
"VT_I2", cchType );
        
break;
    
case VT_I4:
        wcsncpy( pwszType, L
"VT_I4", cchType );
        
break;
    
case VT_I8:
        wcsncpy( pwszType, L
"VT_I8", cchType );
        
break;
    
case VT_UI2:
        wcsncpy( pwszType, L
"VT_UI2", cchType );
        
break;
    
case VT_UI4:
        wcsncpy( pwszType, L
"VT_UI4", cchType );
        
break;
    
case VT_UI8:
        wcsncpy( pwszType, L
"VT_UI8", cchType );
        
break;
    
case VT_R4:
        wcsncpy( pwszType, L
"VT_R4", cchType );
        
break;
    
case VT_R8:
        wcsncpy( pwszType, L
"VT_R8", cchType );
        
break;
    
case VT_CY:
        wcsncpy( pwszType, L
"VT_CY", cchType );
        
break;
    
case VT_DATE:
        wcsncpy( pwszType, L
"VT_DATE", cchType );
        
break;
    
case VT_BSTR:
        wcsncpy( pwszType, L
"VT_BSTR", cchType );
        
break;
    
case VT_ERROR:
        wcsncpy( pwszType, L
"VT_ERROR", cchType );
        
break;
    
case VT_BOOL:
        wcsncpy( pwszType, L
"VT_BOOL", cchType );
        
break;
    
case VT_VARIANT:
        wcsncpy( pwszType, L
"VT_VARIANT", cchType );
        
break;
    
case VT_DECIMAL:
        wcsncpy( pwszType, L
"VT_DECIMAL", cchType );
        
break;
    
case VT_I1:
        wcsncpy( pwszType, L
"VT_I1", cchType );
        
break;
    
case VT_UI1:
        wcsncpy( pwszType, L
"VT_UI1", cchType );
        
break;
    
case VT_INT:
        wcsncpy( pwszType, L
"VT_INT", cchType );
        
break;
    
case VT_UINT:
        wcsncpy( pwszType, L
"VT_UINT", cchType );
        
break;
    
case VT_VOID:
        wcsncpy( pwszType, L
"VT_VOID", cchType );
        
break;
    
case VT_SAFEARRAY:
        wcsncpy( pwszType, L
"VT_SAFEARRAY", cchType );
        
break;
    
case VT_USERDEFINED:
        wcsncpy( pwszType, L
"VT_USERDEFINED", cchType );
        
break;
    
case VT_LPSTR:
        wcsncpy( pwszType, L
"VT_LPSTR", cchType );
        
break;
    
case VT_LPWSTR:
        wcsncpy( pwszType, L
"VT_LPWSTR", cchType );
        
break;
    
case VT_RECORD:
        wcsncpy( pwszType, L
"VT_RECORD", cchType );
        
break;
    
case VT_FILETIME:
        wcsncpy( pwszType, L
"VT_FILETIME", cchType );
        
break;
    
case VT_BLOB:
        wcsncpy( pwszType, L
"VT_BLOB", cchType );
        
break;
    
case VT_STREAM:
        wcsncpy( pwszType, L
"VT_STREAM", cchType );
        
break;
    
case VT_STORAGE:
        wcsncpy( pwszType, L
"VT_STORAGE", cchType );
        
break;
    
case VT_STREAMED_OBJECT:
        wcsncpy( pwszType, L
"VT_STREAMED_OBJECT", cchType );
        
break;
    
case VT_STORED_OBJECT:
        wcsncpy( pwszType, L
"VT_BLOB_OBJECT", cchType );
        
break;
    
case VT_CF:
        wcsncpy( pwszType, L
"VT_CF", cchType );
        
break;
    
case VT_CLSID:
        wcsncpy( pwszType, L
"VT_CLSID", cchType );
        
break;
    
default:
        _snwprintf( pwszType, cchType, L
"Unknown (%d)"
                    vt 
& VT_TYPEMASK );
        
break;
    }


    
// Adjust cchType for the added characters.

    cchType 
-= wcslen(pwszType);

    
// Add the type modifiers, if present.

    
if( vt & VT_VECTOR )
    
{
        pwszModifier 
= L" | VT_VECTOR";        
        wcsncat( pwszType, pwszModifier, cchType );
        cchType 
-= wcslen( pwszModifier );
    }


    
if( vt & VT_ARRAY )
    
{
        pwszModifier 
= L" | VT_ARRAY";        
        wcsncat( pwszType, pwszModifier, cchType );
        cchType 
-= wcslen( pwszModifier );
    }


    
if( vt & VT_RESERVED )
    
{
        pwszModifier 
= L" | VT_RESERVED";        
        wcsncat( pwszType, pwszModifier, cchType );
        cchType 
-= wcslen( pwszModifier );
    }


}



// +-------------------------------------------------------------------
//
//   ConvertValueToString
//   
//   Generate a string for the value in a given PROPVARIANT structure.
//   The most common types are supported; that is, those that can be
//   displayed with printf.  For other types, only an ellipses (...) 
//   is displayed.
//
//   The property to create a string from is in propvar, the resulting
//   string is placed into pwszValue, which is a buffer with space for
//   cchValue characters (including the string terminator).
//
// +-------------------------------------------------------------------

void
ConvertValueToString( 
const  PROPVARIANT  & propvar,
                      WCHAR 
* pwszValue,
                      ULONG cchValue )
{
    
// Ensure that the output string is terminated

    pwszValue[ cchValue 
- 1 ] = L'';
    
--cchValue;

    
// Based on the type, put the value into pwszValue as a string.

    
switch( propvar.vt )
    
{
    
case VT_EMPTY:
        wcsncpy( pwszValue, L
"", cchValue );
        
break;
    
case VT_NULL:
        wcsncpy( pwszValue, L
"", cchValue );
        
break;
    
case VT_I2:
        _snwprintf( pwszValue, cchValue, L
"%i", propvar.iVal );
        
break;
    
case VT_I4:
    
case VT_INT:
        _snwprintf( pwszValue, cchValue, L
"%li", propvar.lVal );
        
break;
    
case VT_I8:
        _snwprintf( pwszValue, cchValue, L
"%I64i", propvar.hVal );
        
break;
    
case VT_UI2:
        _snwprintf ( pwszValue, cchValue, L
"%u", propvar.uiVal );
        
break;
    
case VT_UI4:
    
case VT_UINT:
        _snwprintf ( pwszValue, cchValue, L
"%lu", propvar.ulVal );
        
break;
    
case VT_UI8:
        _snwprintf ( pwszValue, cchValue, L
"%I64u", propvar.uhVal );
        
break;
    
case VT_R4:
        _snwprintf ( pwszValue, cchValue, L
"%f", propvar.fltVal );
        
break;
    
case VT_R8:
        _snwprintf ( pwszValue, cchValue, L
"%lf", propvar.dblVal );
        
break;
    
case VT_BSTR:
        _snwprintf ( pwszValue, cchValue, L
""%s""
                     propvar.bstrVal );
        
break;
    
case VT_ERROR:
        _snwprintf ( pwszValue, cchValue, L
"0x%08X", propvar.scode );
        
break;
    
case VT_BOOL:
        _snwprintf ( pwszValue, cchValue, L
"%s",
               VARIANT_TRUE 
== propvar.boolVal ? L"True" : L"False" );
        
break;
    
case VT_I1:
        _snwprintf ( pwszValue, cchValue, L
"%i", propvar.cVal );
        
break;
    
case VT_UI1:
        _snwprintf ( pwszValue, cchValue, L
"%u", propvar.bVal );
        
break;
    
case VT_VOID:
        wcsncpy( pwszValue, L
"", cchValue );
        
break;
    
case VT_LPSTR:
        
if0 > _snwprintf ( pwszValue, cchValue, 
                             L
""%hs"", propvar.pszVal ))
            
// String is too large for pwszValue
            wcsncpy( pwszValue, L"...", cchValue );
        
break;
    
case VT_LPWSTR:
        
if0 > _snwprintf ( pwszValue, cchValue, 
                             L
""%s"", propvar.pwszVal ))
            
// String is too large for pwszValue
            wcsncpy( pwszValue, L"...", cchValue );
        
break;
    
case VT_FILETIME:
        _snwprintf ( pwszValue, cchValue, L
"%08x:%08x",
                     propvar.filetime.dwHighDateTime,
                     propvar.filetime.dwLowDateTime );
        
break;
    
case VT_CLSID:
        pwszValue[
0= L'';
        StringFromGUID2( 
*propvar.puuid, pwszValue, cchValue );
        
break;
    
default:
        wcsncpy( pwszValue, L
"...", cchValue );
        
break;
    }


}

  参考: http://msdn2.microsoft.com/en-us/library/aa379016.aspx
VARIANT 到 QString转换 不错。 阅读详情

相关推荐

【已解决】C++ QT如何将QVariant转换为QString

本博文源于笔者在公司写的QT,遇到了一个QVariant化为QString不会的难题,我搜索了20分钟,将其进行解决,希望能帮助到大家。

执念斩长河 1260

把_variant_t转换string

string userName=""; FieldPtr m_fieldCtl; m_fieldCtl = m_pRecordSet->Fields->GetItem(long(0)); _variant_t us=m_fieldCtl->Value; userName=(char*)(_bstr_t)us;

whysnlc的专栏 6853

VARIANT 传递字符串数组

TCHAR* strArray[2] = {_T("Hello"),_T("World")}; int arraySize = sizeof(strArray) / sizeof(strArray[0]); //创建 VARIANT vtArray; VariantInit(&vtArray); vtArray.vt = VT_ARRAY | VT_VARIANT; vtArray.parray = SafeArrayCreateVecto...

yjz1409276的专栏 821

Delphi--StreamVariant

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34301307的博客 165

<2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvTools(五)—— Utils(中)

<2021SC@SDUSC> 开源游戏引擎 Overload 代码模块分析 之 OvTools(五)—— Utils(中) 本篇是开源游戏引擎 Overload 模块 OvTools 的 Utils 小模块的中篇。本篇咱们继续探究接下来两个部分:ReferenceOrValue 与 SizeConverter。

Egovix 的博客 507

_variant_t与其他数据类型转换

自:http://kuaixingdong.blog.hexun.com/29627840_d.html 我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法; _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口

白永辉的专栏 2万+

VARIANT型变量转换

1、 在VC++编程中,我们常常会遇到这样的函数,如:::SetValue(const VARIANT& propVal); 我们怎么把一个整形或double型等其它的类型赋值给VARIANT型变量呢,或者是VARIANT型变量怎么赋值给int等其它类型呢。 2、 VARIANT是一个结构体,它的结构体如下: struct tagVARIANT {     union {         

jlp11260的专栏 2611

VARIANT与CString相互转换

VARIANT 类型经常用来给 COM 对象传递参数,或者接收从 COM 对象返回的值。你也能自己编写返回 VARIANT 类型的方法,函数返回什么类型 依赖可能(并且常常)方法的输入参数(比如,在自动化操作中,依赖与你调用哪个方法。IDispatch::Invoke 可能返回(通过其一个参数)一个 包含有BYTE、WORD、float、double、date、BSTR 等等 VARIAN

冷秋魂的专栏 7241

_variant_t类型和CString类型、CTime类型的相互转换

在做MFC对数据库进行操作时,涉及到

u013240179的专栏 5959

VARIANT、_variant_t 与 COleVariant 相互转换

VARIANT的结构可以参考头文件VC98/Include/OAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;///指明整型数据 va.lVal=a; ///赋值 对于不马上赋值的

冷秋魂的专栏 2397

变体类型Variant

变体类型Variant,能够在运行期间动态的改变类型。变体类型能支持所有简单的数据类型,如整型、浮点、字符串、布尔型、日期时间、货币及OLE自动化对象等,不能够表达Object Pascal对象。 1.VarArrayCreate function Creates a variant array. 创建一个变体类型的数组。 function VarArrayCreate(const Bou

曾经沧海 3163

_variant_t类型的使用

Normal 0 7.8 pt 0 2 false false false EN-US ZH-CN X-NONE

nathannemo的专栏 1691

字符串转换系列三:VARIANT、COleVariant 和_variant_t

  三、VARIANT、COleVariant 和_variant_t  在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版:struct tagVARIANT { VARTYPE vt; union {  sho

timewolf的专栏 1万+

_variant_t 转换成其他类型

我定义了一组函数可以方便的实现_variant_t类型转换 //_variant_tWORD类型 BOOL AfxVariantConvert(WORD& val, const _variant_t& vt) { if (vt.vt == VT_UI2) { val = (WORD)vt.uiVal; return TRUE; } else

techliangc的专栏 1096

Variant类型转换成CString代码

在对数据库操作中通常都会用到Variant 和_bstr_t类型,在网上也有很多关于这方面的代码。而在进行MFC等程序中,通常都会用到CString类。从Variant转换成CString代码如下:view plaincopy to clipboardprint? CString VariantToString(_variant_t var)   {       CString strV

hjj404的博客 1618
上一篇: Projects that use Doxygen
下一篇: 如何在Carbide.c++下查看RDebug输出?
dyw
dyw
博客等级 码龄26年 472粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值