关闭

VARIANT类型的两个转换函数

标签: uiobjectvectorstreamnulldate
1193人阅读 评论(0) 收藏 举报
分类:
下面是摘自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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:263517次
    • 积分:3613
    • 等级:
    • 排名:第9024名
    • 原创:81篇
    • 转载:6篇
    • 译文:5篇
    • 评论:94条
    文章分类
    最新评论
    My Favorite Links