Compartilhar via


Função RoParseTypeName (rometadataresolution.h)

Analisa um nome de tipo e parâmetros de tipo existentes, no caso de tipos parametrizados.

Sintaxe

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

Parâmetros

[in] typeName

Tipo: HSTRING

Nome do tipo codificado em cadeia de caracteres. O typename pode ser um tipo não qualificado por namespace, um tipo qualificado por namespace não parametrizado ou um tipo parametrizado totalmente instanciado qualificado por namespace.

[out] partsCount

Tipo: DWORD*

Número de elementos na matriz typenameParts .

typeNameParts

Tipo: HSTRING**

O primeiro elemento da matriz é o tipo especificado e os elementos de matriz restantes são os parâmetros de tipo (se houver) na ordem de árvore pré-caminhada.

Retornar valor

Tipo: HRESULT

Essa função pode retornar um desses valores.

Código de retorno Descrição
S_OK
A análise foi bem-sucedida.
E_INVALIDARG
typeName contém nulos inseridos ou está vazio.
RO_E_METADATA_INVALID_TYPE_FORMAT
typename não está bem formado.

Comentários

A função RoParseTypeName analisa o nome do tipo codificado em cadeia de caracteres e retorna uma matriz de valores HSTRING . O primeiro elemento da matriz é o tipo base e os elementos de matriz restantes são os parâmetros de tipo, se houver, na ordem de passagem de árvore de pré-encomenda. S_OK será retornado se a análise tiver sido bem-sucedida.

Aqui estão exemplos de diferentes nomes de tipo de entrada possíveis:

  • Exemplo 1 (tipo não qualificado para namespace)
    • Nome do tipo de entrada

      Cadeia de caracteres

    • Saída

      Elemento de matriz 0: Cadeia de caracteres

  • Exemplo 2 (tipo qualificado para namespace não parametrizado)
    • Nome do tipo de entrada

      Windows.Foundation.IExtensionInformation

    • Saída

      Elemento array 0: Windows.Foundation.IExtensionInformation

  • Exemplo 3 (tipo de interface parametrizada instanciada)
    • Nome do tipo de entrada

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

    • Saída

      Elemento array 0: Windows.Foundation.Collections.IIterator'1

      Elemento array 1: Windows.Foundation.Collections.IMapView'2

      Elemento de matriz 2: Windows.Foundation.Collections.IVector'1

      Elemento de matriz 3: Cadeia de caracteres

      Elemento De matriz 4: Cadeia de caracteres

Ao analisar um tipo não parametrizado, a função RoParseTypeName retorna uma matriz que tem um elemento . Consulte o exemplo 1 e o exemplo 2 acima.

A cadeia de caracteres de entrada deve não estar vazia e não deve conter caracteres nulos inseridos. Caso contrário, a API falhará com E_INVALIDARG. Se o typename estiver mal formado, como IVector'1<, a API falhará com o código de erro RO_E_METADATA_INVALID_TYPE_FORMAT .

A função RoParseTypeName valida apenas o formato do typename e não sua sintaxe. Por exemplo, a função valida que um nome de tipo de interface parametrizado qualificado por namespace segue o formato mostrado na tabela a seguir, mas não impõe nenhum requisito sobre quais caracteres/símbolos podem ser usados no nome do tipo, exceto que ele não deve conter caracteres , <ou > .

O formato de uma interface parametrizada com codificação de cadeia de caracteres com instância é o seguinte:

Nome da interface parametrizada Caractere de acento grave (') Número de parâmetros de tipo Colchete angular esquerdo (<) Nome qualificado do namespace de cada parâmetro de tipo, separado por vírgulas. Colchete angular direito (>)
 

Os parâmetros de tipo podem ser:

  • Tipos não parametrizados, não qualificados por namespace, como tipos fundamentais do WinRT.
  • Tipos qualificados para namespace não parametrizados.
  • Interfaces parametrizadas totalmente instanciadas qualificadas por namespace.
Em caso de êxito, o chamador é responsável por desalocar a matriz typenameParts retornada por RoParseTypeName usando CoTaskMemFree para liberar a matriz e WindowsDeleteString para liberar os valores HSTRING .

Exemplos

O exemplo C++ a seguir mostra como usar a função RoParseTypeName para localizar os namespaces filho diretos para um nome 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 Valor
Cliente mínimo com suporte Windows 8 [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2012 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho rometadataresolution.h
Biblioteca WinTypes.lib
DLL WinTypes.dll