Функция RoParseTypeName (rometadataresolution.h)
Анализирует имя типа и существующие параметры типа в случае параметризованных типов.
Синтаксис
HRESULT RoParseTypeName(
[in] HSTRING typeName,
[out] DWORD *partsCount,
HSTRING **typeNameParts
);
Параметры
[in] typeName
Тип: HSTRING
Имя типа в строковой кодировке. Typename может быть типом, не соответствующим пространству имен, непараметризованным типом пространства имен или полным экземпляром параметризованного типа пространства имен.
[out] partsCount
Тип: DWORD*
Количество элементов в массиве typenameParts .
typeNameParts
Тип: HSTRING**
Первый элемент массива — это указанный тип, а остальные элементы массива — это параметры типа (если таковые имеются) в порядке дерева перед переходом.
Возвращаемое значение
Тип: HRESULT
Эта функция может возвращать одно из этих значений.
Код возврата | Описание |
---|---|
|
Синтаксический анализ был успешным. |
|
TypeName содержит внедренные значения NULL или пуст. |
|
имя_типа неправильно сформировано. |
Комментарии
Функция RoParseTypeName анализирует имя типа в строковой кодировке и возвращает массив значений HSTRING . Первый элемент массива является базовым типом, а остальные элементы массива являются параметрами типа, если таковые имеются, в порядке обхода дерева предварительного порядка. S_OK возвращается в случае успешного анализа.
Ниже приведены примеры различных возможных входных имен типов:
-
Пример 1 (тип, не относясь к пространству имен)
-
Имя входного типа
Строка
-
Выходные данные
Элемент Array 0: String
-
Имя входного типа
-
Пример 2 (не параметризованный тип пространства имен)
-
Имя входного типа
Windows.Foundation.IExtensionInformation
-
Выходные данные
Элемент Array 0: Windows.Foundation.IExtensionInformation
-
Имя входного типа
-
Пример 3 (экземпляр параметризованного типа интерфейса)
-
Имя входного типа
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<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: Строка
-
Имя входного типа
Входная строка должна быть непустой и не должна содержать внедренные символы NULL. В противном случае API завершается сбоем с E_INVALIDARG. Если имя типа имеет неправильный формат, например IVector'1<, API завершится ошибкой с кодом RO_E_METADATA_INVALID_TYPE_FORMAT .
Функция RoParseTypeName проверяет только формат имени типа , но не его синтаксис. Например, функция проверяет, соответствует ли параметризованное имя типа интерфейса с указанием пространства имен формату, приведенному в следующей таблице, но не предъявляет никаких требований к символам и символам, которые могут использоваться в имени типа, за исключением того, что она не должна содержать символы , <или > .
Формат для экземпляра параметризованного интерфейса в строковом кодировании выглядит следующим образом:
Имя параметризованного интерфейса | Символ обратного удара (') | Число параметров типа | Левая угловая скобка (<) | Полное имя пространства имен каждого параметра типа, разделенное запятыми. | Правая угловая скобка (>) |
Параметры типа могут быть следующими:
- Непараметровизованные типы, не соответствующие пространству имен, например базовые типы WinRT.
- Непараметровизованные типы пространства имен.
- Полный экземпляр параметризованных интерфейсов с указанием пространства имен.
Примеры
В следующем примере 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 |