下面是摘自MSDN的两个函数:
1、ConvertVarTypeToString —— 将Variant类型转换为字符串
2、ConvertValueToString —— 将Variant值转换为字符串
在查看Variant值方面很有用处。
参考: http://msdn2.microsoft.com/en-us/library/aa379016.aspx
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:
if( 0 > _snwprintf ( pwszValue, cchValue,
L""%hs"", propvar.pszVal ))
// String is too large for pwszValue
wcsncpy( pwszValue, L"...", cchValue );
break;
case VT_LPWSTR:
if( 0 > _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;
}
}
//
// 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:
if( 0 > _snwprintf ( pwszValue, cchValue,
L""%hs"", propvar.pszVal ))
// String is too large for pwszValue
wcsncpy( pwszValue, L"...", cchValue );
break;
case VT_LPWSTR:
if( 0 > _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