Función RoParseTypeName (rometadataresolution.h)
Analiza un nombre de tipo y parámetros de tipo existentes, en el caso de tipos con parámetros.
Sintaxis
HRESULT RoParseTypeName(
[in] HSTRING typeName,
[out] DWORD *partsCount,
HSTRING **typeNameParts
);
Parámetros
[in] typeName
Tipo: HSTRING
Nombre de tipo con codificación de cadena. El typename puede ser un tipo no calificado para el espacio de nombres, un tipo calificado para espacios de nombres no con parámetros o un tipo con parámetros completo con un espacio de nombres con instancias completas.
[out] partsCount
Tipo: DWORD*
Número de elementos de la matriz typenameParts .
typeNameParts
Tipo: HSTRING**
El primer elemento de la matriz es el tipo especificado y los elementos de matriz restantes son los parámetros de tipo (si los hay) en orden de árbol de prewalk.
Valor devuelto
Tipo: HRESULT
Esta función puede devolver uno de estos valores.
Código devuelto | Descripción |
---|---|
|
El análisis se realizó correctamente. |
|
typeName contiene valores NULL incrustados o está vacío. |
|
typename no tiene el formato correcto. |
Comentarios
La función RoParseTypeName analiza el nombre de tipo codificado en cadena y devuelve una matriz de valores HSTRING . El primer elemento de la matriz es el tipo base y los elementos de matriz restantes son los parámetros de tipo, si los hay, en orden de recorrido de árbol en orden previo. S_OK se devuelve si el análisis se realizó correctamente.
Estos son ejemplos de diferentes nombres de tipo de entrada posibles:
-
Ejemplo 1 (tipo no calificado de espacio de nombres)
-
Typename de entrada
String
-
Salida
Elemento array 0: String
-
Typename de entrada
-
Ejemplo 2 (tipo calificado por espacio de nombres no con parámetros)
-
Typename de entrada
Windows.Foundation.IExtensionInformation
-
Salida
Elemento array 0: Windows.Foundation.IExtensionInformation
-
Typename de entrada
-
Ejemplo 3 (tipo de interfaz con parámetros con instancias)
-
Typename de entrada
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<Windows.Foundation.Collections.IVector'1<String>, String>> -
Salida
Elemento array 0: Windows.Foundation.Collections.IIterator'1
Elemento array 1: Windows.Foundation.Collections.IMapView'2
Elemento array 2: Windows.Foundation.Collections.IVector'1
Elemento array 3: String
Elemento array 4: String
-
Typename de entrada
La cadena de entrada debe no estar vacía y no debe contener caracteres NULL incrustados. De lo contrario, se produce un error en la API con E_INVALIDARG. Si el typename tiene un formato incorrecto, como IVector'1<, se producirá un error en la API con el código de error RO_E_METADATA_INVALID_TYPE_FORMAT .
La función RoParseTypeName valida solo el formato del typename y no su sintaxis. Por ejemplo, la función valida que un nombre de tipo de interfaz con parámetros calificado para el espacio de nombres sigue el formato que se muestra en la tabla siguiente, pero no impone ningún requisito sobre qué caracteres o símbolos se pueden usar en el nombre de tipo, excepto que no debe contener " , <o > caracteres.
El formato de una interfaz parametrizada con codificación de cadena es el siguiente:
Nombre de la interfaz parametrizada | Carácter de verso (') | Número de parámetros de tipo | Corchete angular izquierdo (<) | Nombre completo del espacio de nombres de cada parámetro de tipo, separados por comas. | Corchete angular derecho (>) |
Los parámetros de tipo pueden ser:
- Tipos no con parámetros no calificados para espacios de nombres, como los tipos fundamentales de WinRT.
- Tipos no con parámetros calificados para espacios de nombres.
- Instancias completas de interfaces con parámetros calificados por el espacio de nombres.
Ejemplos
En el siguiente ejemplo de C++ se muestra cómo usar la función RoParseTypeName para buscar los espacios de nombres secundarios directos para un nombre de tipo especificado.
#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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 8 [aplicaciones de escritorio | Aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2012 [aplicaciones de escritorio | Aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | rometadataresolution.h |
Library | WinTypes.lib |
Archivo DLL | WinTypes.dll |