VARIANT类型的两个转换函数

下面是摘自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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在VBA中,自定义函数可以通过查询值返回多个值。一种常见的方法是使用数组来存储和返回多个值。下面是一个示例代码,演示了如何通过查询值返回多个值: ```vba Function GetMultipleValues(query As String) As Variant ' 定义一个数组来存储多个值 Dim result() As Variant Dim i As Integer ' 假设你的查询逻辑在这里,将查询的结果存储在数组中 ' 这里只是一个示例,你可以根据实际需求进行修改 If query = "A" Then ReDim result(1 To 2) ' 定义数组的大小 result(1) = "Value 1" result(2) = "Value 2" ElseIf query = "B" Then ReDim result(1 To 3) ' 定义数组的大小 result(1) = "Value 3" result(2) = "Value 4" result(3) = "Value 5" End If ' 返回存储多个值的数组 GetMultipleValues = result End Function ``` 在上面的示例中,自定义函数`GetMultipleValues`接受一个字符串参数`query`作为查询条件。根据不同的查询条件,函数将结果存储在名为`result`的数组中。最后,函数返回这个数组。 要在VBA中使用这个自定义函数,你可以在Excel或其他VBA环境中调用它。例如,在Excel单元格中输入`=GetMultipleValues("A")`,将返回一个包含两个值的数组。 请注意,自定义函数的返回值类型是`Variant`,因为它可以是任何类型的数组。在使用函数的结果时,请根据实际需要进行类型转换。 希望这个示例能对你有所帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值