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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

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

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中定义) 在...

_variant_t与其他数据类型的转换

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

一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……

Document var num = [88, 1151, 1]; (function() { /** * 对于n1,n2,n3;如果其中任意两...

[Microsoft][ODBC Microsoft Access Driver] 试图将 Null 值赋予一个非 Variant 数据类型的变量

今天写代码的时候遇到了一个这样的小问题记录下来(使用的是access数据库)sun.jdbc.odbc.JdbcOdbcBatchUpdateException: [Microsoft][ODBC M...
  • wkcgy
  • wkcgy
  • 2011-01-14 20:27
  • 1529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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