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
S_OK
El análisis se realizó correctamente.
E_INVALIDARG
typeName contiene valores NULL incrustados o está vacío.
RO_E_METADATA_INVALID_TYPE_FORMAT
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

  • 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

  • Ejemplo 3 (tipo de interfaz con parámetros con instancias)
    • Typename de entrada

      Windows.Foundation.Collections.IIterator1&lt;Windows.Foundation.Collections.IMapView2<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

Al analizar un tipo no parametrizado, la función RoParseTypeName devuelve una matriz que tiene un elemento. Consulte el ejemplo 1 y el ejemplo 2 anterior.

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.
Si se ejecuta correctamente, el llamador es responsable de desasignar la matriz typenameParts devuelta por RoParseTypeName mediante CoTaskMemFree para liberar la matriz y WindowsDeleteString para liberar los valores de HSTRING .

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