Fonction RoGetMetaDataFile (rometadataresolution.h)
Recherche et récupère le fichier de métadonnées qui décrit l’interface binaire d’application (ABI) pour le typename spécifié.
Syntaxe
HRESULT RoGetMetaDataFile(
[in] const HSTRING name,
[in, optional] IMetaDataDispenserEx *metaDataDispenser,
[out, optional] HSTRING *metaDataFilePath,
[out, optional] IMetaDataImport2 **metaDataImport,
[out, optional] mdTypeDef *typeDefToken
);
Paramètres
[in] name
Type : const HSTRING
Nom à résoudre, typename ou espace de noms. La chaîne d’entrée de nom doit être non vide et ne doit pas contenir de caractères NUL incorporés. Si le nom est une chaîne séparée par des points, la sous-chaîne à gauche du dernier point et la sous-chaîne à droite du dernier point doivent être non vides.
[in, optional] metaDataDispenser
Type : IMetaDataDispenserEx*
Distributeur de métadonnées que l’appelant peut éventuellement passer pour que la fonction RoGetMetaDataFile puisse ouvrir les fichiers de métadonnées via la méthode IMetaDataDispenserEx ::OpenScope fournie. Si le paramètre du distributeur de métadonnées est défini sur nullptr, la fonction crée un instance interne du lecteur de métadonnées refactorisé (RoMetadata.dll) et utilise sa méthode IMetaDataDispenserEx ::OpenScope. Vous pouvez créer un distributeur de métadonnées à l’aide de la fonction MetaDataGetDispenser .
[out, optional] metaDataFilePath
Type : HSTRING*
Chemin d’accès absolu du fichier de métadonnées (.winmd) qui décrit l’ABI, sauf si la valeur est nullptr. L’appelant est chargé de libérer le HSTRING en appelant la méthode WindowsDeleteString .
[out, optional] metaDataImport
Type : IMetaDataImport2**
Pointeur vers l’objet lecteur de fichier de métadonnées. Si l’appelant passe un nullptr , la fonction libère la référence IMetaDataImport2 , sinon l’appelant doit libérer la référence. La valeur est définie sur nullptr en cas d’échec.
[out, optional] typeDefToken
Type : mdTypeDef*
Si la chaîne d’entrée de nom est correctement résolue en tant que typename, ce paramètre est défini sur le jeton du typename.
En cas d’échec, ce paramètre est défini sur mdTypeDefNil.
Valeur retournée
Type : HRESULT
Cette fonction peut retourner l’une de ces valeurs.
Code de retour | Description |
---|---|
|
La résolution a réussi, ce qui signifie que la chaîne d’entrée représente un type défini dans un fichier .winmd. |
|
Au moins l’une des propriétés suivantes de la chaîne de nom d’entrée ne contient pas :
|
|
La chaîne d’entrée n’est pas un type défini dans un fichier .winmd examiné. |
|
La chaîne d’entrée est un espace de noms existant plutôt qu’un typename. |
Remarques
L’appelant peut éventuellement passer un distributeur de métadonnées pour la fonction RoGetMetaDataFile afin d’ouvrir les fichiers de métadonnées via la méthode IMetaDataDispenserEx ::OpenScope .
Si le paramètre du distributeur de métadonnées est défini sur nullptr, la fonction crée un instance interne du lecteur de métadonnées refactorisé et utilise la méthode IMetaDataDispenserEx ::OpenScope de ce lecteur.
La fonction RoGetMetaDataFile est garantie comme thread-safe si vous passez nullptr au paramètre de distributeur de métadonnées, car la fonction crée un lecteur de métadonnées en lecture seule interne. Cette garantie est également valable si vous transmettez le lecteur de métadonnées en lecture seule, comme RoMetadata à la fonction .
Les trois paramètres de sortie sont facultatifs et aucun d’entre eux ne doit être spécifié. Appeler la fonction RoGetMetaDataFile avec nullptr pour tous les paramètres de sortie revient à demander si le typename d’entrée ou l’espace de noms est défini.
L’objet de lecteur de métadonnées fait référence et les paramètres de jeton TypeDef associés. Les deux doivent donc être définis ensemble ou avoir la valeur nullptr.
Il existe trois scénarios de résolution de type possibles :
Scénario 1 |
La chaîne d’entrée Typename est un type défini dans un fichier WinMD.
|
Scénario 2 | La chaîne d’entrée typename est en fait un espace de noms existant plutôt qu’un typename.
|
Scénario 3 | La chaîne d’entrée n’est pas un type défini dans un fichier WinMD examiné
|
La fonction RoGetMetaDataFile résout un groupe d’interfaces, car l’interfacegroup est également un typename qualifié d’espace de noms. La méthode IInspectable ::GetRuntimeClassName retourne la chaîne au format de chaîne séparée par des points à utiliser par RoGetMetaDataFile.
La résolution de types tiers à partir d’un processus qui n’est pas dans une application du Windows Store n’est pas prise en charge. Dans ce cas, la fonction retourne l’erreur HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) et définit les paramètres de sortie sur nullptr. Toutefois, les types Windows sont résolus dans un processus qui n’est pas dans une application du Windows Store.
Exemples
L’exemple C++ suivant montre comment utiliser la fonction RoGetMetaDataFile pour rechercher le fichier de métadonnées d’un nom de type spécifié.
#include <windows.h>
#include <stdio.h>
#include <WinRTString.h>
#include <TypeResolution.h>
#include <atlbase.h>
HRESULT PrintMetaDataFilePathForTypeName(PCWSTR pszTypename);
int ShowUsage()
{
wprintf(L"Usage: RoGetMetaDataFileSample TypeName\n");
return -1;
}
int __cdecl wmain(int argc, WCHAR **argv)
{
if (argc != 2)
{
return ShowUsage();
}
HRESULT hr = PrintMetaDataFilePathForTypeName(argv[1]);
if (SUCCEEDED(hr))
{
return 0;
}
else
{
return -1;
}
}
HRESULT PrintMetaDataFilePathForTypeName(PCWSTR pszTypename)
{
HRESULT hr;
HSTRING hstrTypeName = nullptr;
HSTRING hstrMetaDataFilePath = nullptr;
CComPtr<IMetaDataImport2> spMetaDataImport;
mdTypeDef typeDef;
hr = WindowsCreateString(
pszTypename,
static_cast<UINT32>(wcslen(pszTypename)),
&hstrTypeName);
if (SUCCEEDED(hr))
{
hr = RoGetMetaDataFile(
hstrTypeName,
nullptr,
&hstrMetaDataFilePath,
&spMetaDataImport,
&typeDef);
}
if (SUCCEEDED(hr))
{
wprintf(L"Type %s was found in %s\n", pszTypename, WindowsGetStringRawBuffer(hstrMetaDataFilePath, nullptr));
}
else if (hr == RO_E_METADATA_NAME_NOT_FOUND)
{
wprintf(L"Type %s was not found!\n", pszTypename);
}
else
{
wprintf(L"Error %x occurred while trying to resolve %s!\n", hr, pszTypename);
}
// Clean up resources.
if (hstrTypeName != nullptr)
{
WindowsDeleteString(hstrTypeName);
}
if (hstrMetaDataFilePath != nullptr)
{
WindowsDeleteString(hstrMetaDataFilePath);
}
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 | WindowsApp.lib |
DLL | WinTypes.dll |