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 |
---|---|
|
L’analyse a réussi. |
|
typeName contient des valeurs Null incorporées ou est vide. |
|
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
-
Typename d’entrée
-
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
-
Typename d’entrée
-
Exemple 3 (type d’interface paramétrable instanciée)
-
Typename d’entrée
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<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
-
Typename d’entrée
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.
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 |