RoParseTypeName 函数 (rometadataresolution.h)

分析类型名称和现有类型参数(如果是参数化类型)。

语法

HRESULT RoParseTypeName(
  [in]  HSTRING typeName,
  [out] DWORD   *partsCount,
        HSTRING **typeNameParts
);

参数

[in] typeName

类型: HSTRING

字符串编码的 typename。 typename 可以是非命名空间限定类型、非参数化命名空间限定类型或完全实例化的命名空间限定参数化类型。

[out] partsCount

类型: DWORD*

typenameParts 数组中的元素数。

typeNameParts

类型: HSTRING**

数组的第一个元素是指定的类型,其余数组元素是 (类型参数(如果任何) 采用预行树顺序)。

返回值

类型: HRESULT

此函数可以返回其中一个值。

返回代码 说明
S_OK
分析成功。
E_INVALIDARG
typeName 包含嵌入的 null 或 为空。
RO_E_METADATA_INVALID_TYPE_FORMAT
typename 格式不正确。

注解

RoParseTypeName 函数分析字符串编码的类型名称并返回 HSTRING 值的数组。 数组的第一个元素是基类型,其余数组元素是按预序树遍历顺序的类型参数(如果有)。 如果分析成功,则返回S_OK

下面是不同可能的输入类型名称的示例:

  • 示例 1 (非命名空间限定类型)
    • 输入 typename

      String

    • 输出

      数组元素 0:字符串

  • 示例 2 (非参数化命名空间限定类型)
    • 输入 typename

      Windows.Foundation.IExtensionInformation

    • 输出

      Array 元素 0:Windows.Foundation.IExtensionInformation

  • 示例 3 (实例化参数化接口类型)
    • 输入 typename

      Windows.Foundation.Collections.IIterator1&lt;Windows.Foundation.Collections.IMapView2<Windows.Foundation.Collections.IVector'1<String>, String>>

    • 输出

      Array 元素 0:Windows.Foundation.Collections.IIterator'1

      Array 元素 1:Windows.Foundation.Collections.IMapView'2

      Array 元素 2:Windows.Foundation.Collections.IVector'1

      数组元素 3:字符串

      数组元素 4:字符串

分析非参数化类型时, RoParseTypeName 函数返回一个具有一个元素的数组。 请参阅上面的示例 1 和示例 2。

输入字符串必须是非空的,并且不能包含任何嵌入的 null 字符。 否则,API 将失败并 E_INVALIDARG。 如果 typename 格式不正确(如 IVector'1<),则 API 将失败并 显示RO_E_METADATA_INVALID_TYPE_FORMAT 错误代码。

RoParseTypeName 函数仅验证 typename 的格式,而不验证其语法。 例如,函数验证命名空间限定的参数化接口 typename 是否遵循下表中显示的格式,但它不会对可在 typename 中使用的字符/符号施加任何要求,只不过它不应包含 ' 、 <或 > 字符。

字符串编码实例化参数化接口的格式如下:

参数化接口的名称 反引号字符 (') 类型参数数 左尖括号 (<) 每个类型参数的命名空间限定名称,用逗号分隔。 右尖括号 (>)
 

类型参数可以是:

  • 非参数化、非命名空间限定的类型,如 WinRT 基本类型。
  • 非参数化命名空间限定类型。
  • 完全实例化的命名空间限定参数化接口。
成功后,调用方负责解除分配 RoParseTypeName 返回的 typenameParts 数组,方法是使用 CoTaskMemFree 释放数组,并使用 WindowsDeleteString 释放 HSTRING 值。

示例

以下 C++ 示例演示如何使用 RoParseTypeName 函数查找指定类型名称的直接子命名空间。

#include <windows.h>
#include <stdio.h>
#include <WinRTString.h>
#include <TypeResolution.h>

HRESULT PrintParameterizedInterfaceParts(PCWSTR pszTypename);

int ShowUsage()
{
    wprintf(L"Usage: RoParseTypeNameSample \"TypeName\"\n");
    return -1;
}

int __cdecl wmain(int argc, WCHAR **argv)
{
    if (argc != 2)
    {
        return ShowUsage();
    }

    HRESULT hr = PrintParameterizedInterfaceParts(argv[1]);

    if (SUCCEEDED(hr))
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

HRESULT PrintParameterizedInterfaceParts(PCWSTR pszTypename)
{
    HRESULT hr;
    HSTRING hstrTypeName = nullptr;
    HSTRING *phstrNameParts = nullptr;
    DWORD cRetrievedNameParts = 0;

    hr = WindowsCreateString(
        pszTypename,
        static_cast<UINT32>(wcslen(pszTypename)),
        &hstrTypeName);

    if (SUCCEEDED(hr))
    {
        hr = RoParseTypeName(
            hstrTypeName,
            &cRetrievedNameParts,
            &phstrNameParts);
    }

    if (SUCCEEDED(hr))
    {
        wprintf(L"Parameterized interface %s is composed of:\n", pszTypename);

        for (UINT32 i = 0; i < cRetrievedNameParts; i++)
        {
            wprintf(L"Element %d: %s\n", i, WindowsGetStringRawBuffer(phstrNameParts[i], nullptr));
        }
    }
    else
    {
        wprintf(L"Invalid parameterized interface syntax: %s!\n", pszTypename);
    }

    // Clean up resources.
    if (hstrTypeName != nullptr)
    {
        WindowsDeleteString(hstrTypeName);
    }

    for (UINT32 i = 0; i < cRetrievedNameParts; i++)
    {
        WindowsDeleteString(phstrNameParts[i]);
    }

    CoTaskMemFree(phstrNameParts);

    return hr;
}

要求

要求
最低受支持的客户端 Windows 8 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2012 [桌面应用 |UWP 应用]
目标平台 Windows
标头 rometadataresolution.h
Library WinTypes.lib
DLL WinTypes.dll