Fonction RoParseTypeName (rometadataresolution.h)

Analyse un nom de type et des paramètres de type existants, dans le cas de types paramétrables.

Syntaxe

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

Paramètres

[in] typeName

Type : HSTRING

Typename encodé en chaîne. Le typename peut être un type non qualifié d’espace de noms, un type qualifié d’espace de noms non paramétrable ou un type paramétrable qualifié d’espace de noms entièrement instancié.

[out] partsCount

Type : DWORD*

Nombre d’éléments dans le tableau typenameParts .

typeNameParts

Type : HSTRING**

Le premier élément du tableau est le type spécifié, et les éléments de tableau restants sont les paramètres de type (le cas échéant) dans l’ordre de l’arborescence de pré-sortie.

Valeur retournée

Type : HRESULT

Cette fonction peut retourner l’une de ces valeurs.

Code de retour Description
S_OK
L’analyse a réussi.
E_INVALIDARG
typeName contient des valeurs Null incorporées ou est vide.
RO_E_METADATA_INVALID_TYPE_FORMAT
typename n’est pas bien formé.

Remarques

La fonction RoParseTypeName analyse le nom de type encodé sous forme de chaîne et retourne un tableau de valeurs HSTRING . Le premier élément du tableau est le type de base, et les éléments de tableau restants sont les paramètres de type, le cas échéant, dans l’ordre de traversée de l’arborescence de pré-ordre. S_OK est retourné si l’analyse a réussi.

Voici des exemples de différents types d’entrée possibles :

  • Exemple 1 (type non qualifié d’espace de noms)
    • Typename d’entrée

      String

    • Sortie

      Élément array 0 : String

  • Exemple 2 (type qualifié d’espace de noms non paramétrable)
    • Typename d’entrée

      Windows.Foundation.IExtensionInformation

    • Sortie

      Élément array 0 : Windows.Foundation.IExtensionInformation

  • Exemple 3 (type d’interface paramétrable instanciée)
    • Typename d’entrée

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

    • Sortie

      Élément array 0 : Windows.Foundation.Collections.IIterator'1

      Élément array 1 : Windows.Foundation.Collections.IMapView'2

      Élément array 2 : Windows.Foundation.Collections.IVector'1

      Élément array 3 : String

      Élément de tableau 4 : Chaîne

Lors de l’analyse d’un type non paramétrable, la fonction RoParseTypeName retourne un tableau qui a un élément. Reportez-vous à l’exemple 1 et à l’exemple 2 ci-dessus.

La chaîne d’entrée doit être non vide et ne doit pas contenir de caractères Null incorporés. Sinon, l’API échoue avec E_INVALIDARG. Si le typename est mal formé, comme IVector'1<, l’API échoue avec le code d’erreur RO_E_METADATA_INVALID_TYPE_FORMAT .

La fonction RoParseTypeName valide uniquement le format du typename et non sa syntaxe. Par exemple, la fonction valide qu’un type d’interface paramétrable qualifié d’espace de noms suit le format indiqué dans le tableau suivant, mais elle n’impose aucune exigence sur les caractères/symboles pouvant être utilisés dans le typename, sauf qu’il ne doit pas contenir de caractères , <ou > .

Le format d’une interface paramétrable instanciée encodée sous forme de chaîne est le suivant :

Nom de l’interface paramétrable Caractère backtick (') Nombre de paramètres de type Crochet gauche (<) Nom qualifié d’espace de noms de chaque paramètre de type, séparé par des virgules. Crochet droit (>)
 

Les paramètres de type peuvent être :

  • Types non paramétrables et non qualifiés d’espace de noms, comme les types fondamentaux WinRT.
  • Types qualifiés d’espace de noms non paramétrables.
  • Interfaces paramétrables qualifiées d’espace de noms entièrement instanciées.
En cas de réussite, l’appelant est responsable de l’allocation du tableau typenameParts retourné par RoParseTypeName à l’aide de CoTaskMemFree pour libérer le tableau et de WindowsDeleteString pour libérer les valeurs HSTRING .

Exemples

L’exemple C++ suivant montre comment utiliser la fonction RoParseTypeName pour rechercher les espaces de noms enfants directs pour un nom de type spécifié.

#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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8 [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2012 [applications de bureau | Applications UWP]
Plateforme cible Windows
En-tête rometadataresolution.h
Bibliothèque WinTypes.lib
DLL WinTypes.dll