Поделиться через


Функция RoParseTypeName (rometadataresolution.h)

Анализирует имя типа и существующие параметры типа в случае параметризованных типов.

Синтаксис

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

Параметры

[in] typeName

Тип: HSTRING

Имя типа в строковой кодировке. Typename может быть типом, не соответствующим пространству имен, непараметризованным типом пространства имен или полным экземпляром параметризованного типа пространства имен.

[out] partsCount

Тип: DWORD*

Количество элементов в массиве typenameParts .

typeNameParts

Тип: HSTRING**

Первый элемент массива — это указанный тип, а остальные элементы массива — это параметры типа (если таковые имеются) в порядке дерева перед переходом.

Возвращаемое значение

Тип: HRESULT

Эта функция может возвращать одно из этих значений.

Код возврата Описание
S_OK
Синтаксический анализ был успешным.
E_INVALIDARG
TypeName содержит внедренные значения NULL или пуст.
RO_E_METADATA_INVALID_TYPE_FORMAT
имя_типа неправильно сформировано.

Комментарии

Функция RoParseTypeName анализирует имя типа в строковой кодировке и возвращает массив значений HSTRING . Первый элемент массива является базовым типом, а остальные элементы массива являются параметрами типа, если таковые имеются, в порядке обхода дерева предварительного порядка. S_OK возвращается в случае успешного анализа.

Ниже приведены примеры различных возможных входных имен типов:

  • Пример 1 (тип, не относясь к пространству имен)
    • Имя входного типа

      Строка

    • Выходные данные

      Элемент Array 0: String

  • Пример 2 (не параметризованный тип пространства имен)
    • Имя входного типа

      Windows.Foundation.IExtensionInformation

    • Выходные данные

      Элемент Array 0: Windows.Foundation.IExtensionInformation

  • Пример 3 (экземпляр параметризованного типа интерфейса)
    • Имя входного типа

      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

      Элемент массива 2: Windows.Foundation.Collections.IVector'1

      Элемент array 3: String

      Элемент Массива 4: Строка

При анализе непараметризованного типа функция RoParseTypeName возвращает массив с одним элементом. См. пример 1 и пример 2 выше.

Входная строка должна быть непустой и не должна содержать внедренные символы NULL. В противном случае API завершается сбоем с E_INVALIDARG. Если имя типа имеет неправильный формат, например IVector'1<, API завершится ошибкой с кодом RO_E_METADATA_INVALID_TYPE_FORMAT .

Функция RoParseTypeName проверяет только формат имени типа , но не его синтаксис. Например, функция проверяет, соответствует ли параметризованное имя типа интерфейса с указанием пространства имен формату, приведенному в следующей таблице, но не предъявляет никаких требований к символам и символам, которые могут использоваться в имени типа, за исключением того, что она не должна содержать символы , <или > .

Формат для экземпляра параметризованного интерфейса в строковом кодировании выглядит следующим образом:

Имя параметризованного интерфейса Символ обратного удара (') Число параметров типа Левая угловая скобка (<) Полное имя пространства имен каждого параметра типа, разделенное запятыми. Правая угловая скобка (>)
 

Параметры типа могут быть следующими:

  • Непараметровизованные типы, не соответствующие пространству имен, например базовые типы WinRT.
  • Непараметровизованные типы пространства имен.
  • Полный экземпляр параметризованных интерфейсов с указанием пространства имен.
При успешном выполнении вызывающий объект отвечает за освобождение массива typenameParts , возвращаемого RoParseTypeName , с помощью 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
Header rometadataresolution.h
Библиотека WinTypes.lib
DLL WinTypes.dll