PropVariantChangeType 函数 (propvarutil.h)

将存储为 PROPVARIANT 结构的值强制转换为不同变体类型的等效值。

语法

PSSTDAPI PropVariantChangeType(
  [out] PROPVARIANT          *ppropvarDest,
  [in]  REFPROPVARIANT       propvarSrc,
  [in]  PROPVAR_CHANGE_FLAGS flags,
  [in]  VARTYPE              vt
);

参数

[out] ppropvarDest

类型: PROPVARIANT*

指向 PROPVARIANT 结构的指针,此函数成功返回时接收强制值及其新类型。

[in] propvarSrc

类型: REFPROPVARIANT

对源 PROPVARIANT 结构的引用,该结构包含以原始类型表示的值。

[in] flags

类型: PROPVAR_CHANGE_FLAGS

保留,必须为 0。

[in] vt

类型: VARTYPE

指定值的新类型。 有关可识别的类型名称,请参阅下表。

返回值

类型: HRESULT

如果成功,则返回 S_OK ,否则返回标准 COM 错误值。 如果无法执行请求的强制操作,则返回错误。

注解

请注意,源和目标 PROPVARIANT 结构必须是单独的结构。 不能使用新的目标数据覆盖源 PROPVARIANT 数据;尝试执行此操作将导致错误。

PropVariantChangeType 在以下类型之间转换值,如下所示。 数字是指表后说明的条件。

VT_LPWSTR VT_BSTR VT_BOOL VT_FILETIME VT_DATE VT_CLSID
VT_LPWSTR 是 (2) 是 (2)
VT_BSTR 是 (2) 是 (2)
VT_BOOL
VT_I2
VT_I4
VT_I8
VT_UI2
VT_UI4
VT_UI8
VT_R8 是 (3) 是 (3)
VT_FILETIME 是 (2) 是 (2)
VT_DATE 是 (2) 是 (2)
VT_CLSID
 
VT_I2 VT_I4 VT_I8 VT_UI2 VT_UI4 VT_UI8 VT_R8
VT_LPWSTR 是 (3)
VT_BSTR 是 (3)
VT_BOOL
VT_I2 是 (1) 是 (1) 是 (1) 是 (1)
VT_I4 是 (1) 是 (1) 是 (1) 是 (1) 是 (1)
VT_I8 是 (1) 是 (1) 是 (1) 是 (1) 是 (1) 是 (1)
VT_UI2 是 (1) 是 (1)
VT_UI4 是 (1) 是 (1) 是 (1) 是 (1)
VT_UI8 是 (1) 是 (1) 是 (1) 是 (1) 是 (1) 是 (1)
VT_R8 是 (1) 是 (1) 是 (1) 是 (1) 是 (1) 是 (1)
VT_FILETIME
VT_DATE
VT_CLSID
 

条件

  1. 在数值类型之间进行转换时,范围外转换会失败。 例如,无符号类型的负有符号值,或大于 65535 的 4 字节无符号值到 2 字节无符号类型。
  2. 在字符串和日期之间转换时,将使用规范字符串形式,而不是本地化或“可读”表示形式。 格式为“yyyy/mm/dd:hh:mm:ss.fff” (年、月、日、小时、分钟、秒、毫秒) 。 请注意,这一精度低于 FILETIME 类型支持的精度,但它应该足以满足大多数目的。
  3. 在浮点数和字符串之间转换时,将使用当前区域设置的十进制分隔符。 请注意,当这些值保存在在不同区域设置之间移动的文件中时,这可能会导致问题。
注意 将来可能支持其他类型。
 
在某些情况下,支持在向量 (VT_VECTOR) 与数组 (VT_ARRAY) 之间进行转换。 如果支持,则每个元素的计数必须相同。 可以将单值向量转换为非向量值,但多值向量不能转换为非向量类型。

在类型之间执行强制转换,而不考虑特定于属性的信息。 应使用 PSCoerceToCanonicalValue 执行特定于属性的强制操作。 此外,如果出于 UI 目的需要值的字符串形式,则应使用 PSFormatForDisplay 根据特定于区域设置和属性的信息设置值的格式,而不是使用 PropVariantChangeType 将值强制转换为字符串。

示例

下面的代码示例将作为较大程序的一部分包含,演示如何使用 PropVariantChangeType 从字符串初始化 VT_FILETIME 值。

PROPVARIANT propvarString = {0};
                    
HRESULT hr = InitPropVariantFromString(L"2007/01/30:12:00:00.000", &propvarString);
if (SUCCEEDED(hr))
{
    PROPVARIANT propvarFiletime = {0};

    hr = PropVariantChangeType(&propvarFiletime, propvarString, 0, VT_FILETIME);
    if (SUCCEEDED(hr))
    {
        // propvarFiletime now contains the FILETIME representation 
        // of 1/30/2007 12:00 PM
        PropVariantClear(&propvarFiletime);
    }
    PropVariantClear(&propvarString);
}

要求

要求
最低受支持的客户端 Windows XP SP2、Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 SP1 [仅限桌面应用]
目标平台 Windows
标头 propvarutil.h
Library Propsys.lib
DLL Propsys.dll (版本 6.0 或更高版本)
可再发行组件 Windows 桌面搜索 (WDS) 3.0