VARIANT类型的两个转换函数

原创 2007年09月18日 08:42:00
下面是摘自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

STL数组和com数组相互转换的做法

作者:朱金灿来源:http://blog.csdn.net/clever101            STL的泛型数组是vetor,com的泛型数组类型是VARIANT。二者怎样能相互转化呢?就是说怎...

[ASP.NET]解决“试图将 Null 值赋予一个非 Variant 数据类型的变量”的问题

错误提示 :"试图将 Null 值赋予一个非 Variant 数据类型的变量" 错误原因:在VS2005中,用ACCESS做数据库时insert into 命令会把自动编号也会加进去,所以这个就需要...

Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)

一、变体类型常用的函数介绍:         Variant: 一种可以拥有各种数据类型; 也可以告诉目前存储的数据是什么类型(通过使用VarType函数); 可以给相同的Variant分配不同的数...

将图像BYTE(unsigned char)数组转换为VARIANT类型

因为近期工作需要完成OCX控件同时支持C#与C++调用,所以接口设置就会遇上些问题。在需要将图片的内存数据(buffer)传入控件时,如果按照C++惯例,设计接口参数类型为unsigned char*...

_variant_t与其他数据类型的转换

转自:http://kuaixingdong.blog.hexun.com/29627840_d.html 我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义...

CString、_bstr_t、_variant_t等类型的相互转换

本文转载自http://blog.csdn.net/yyyzlf/article/details/5209934 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用...

_variant_t与其他数据类型的转换

转自:http://kuaixingdong.blog.hexun.com/29627840_d.html 我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在...

两个类(JAVA类型转换)

  • 2011年10月30日 11:35
  • 4KB
  • 下载

_variant_t 数据类型学习

_variant_t是一个类,是VARIANT的完全包装类,它提供多种构造函数和数据转换函数。它继承自一个结构体,其结构如下: struct  tagVARIANT     {     unio...
  • can_yi
  • can_yi
  • 2015年01月16日 16:13
  • 391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VARIANT类型的两个转换函数
举报原因:
原因补充:

(最多只允许输入30个字)