Partager via


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
S_OK
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.
E_INVALIDARG
Au moins l’une des propriétés suivantes de la chaîne de nom d’entrée ne contient pas :
  • Non null, non vide
  • Ne contient pas de caractères Null incorporés.
  • S’il s’agit d’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.
RO_E_METADATA_NAME_NOT_FOUND
La chaîne d’entrée n’est pas un type défini dans un fichier .winmd examiné.
RO_E_METADATA_NAME_IS_NAMESPACE
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.
  • Valeur renvoyée

    S_OK

  • Paramètre de sortie du chemin d’accès au fichier de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il contient le chemin absolu du fichier .winmd qui décrit l’ABI du type donné. L’appelant est chargé de libérer le HSTRING en appelant WindowsDeleteString.

  • Référence au paramètre de sortie de l’objet lecteur de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. Si ce n’est pas nullptr, il contient une référence à l’objet lecteur de métadonnées (IMetaDataImport2) et l’appelant est responsable de sa publication. Si l’appelant passe nullptr pour ce paramètre, cela signifie que l’appelant ne veut pas l’objet de lecteur de métadonnées, de sorte que la fonction libère la référence interne.

  • Paramètre de sortie de jeton Typedef

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur le jeton de l’entrée typedef du type. Les projections de langage peuvent utiliser ce jeton pour appeler IMetaDataImport ::GetTypeDefProps afin d’obtenir des métadonnées sur le type.

Scénario 2 La chaîne d’entrée typename est en fait un espace de noms existant plutôt qu’un typename.
  • Valeur retournée

    RO_E_METADATA_NAME_IS_NAMESPACE

  • Paramètre de sortie du chemin d’accès au fichier de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur nullptr.

  • Référence au paramètre de sortie de l’objet lecteur de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur nullptr.

  • Paramètre de sortie de jeton Typedef

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il s’agit de mdTypeDefNil.

Scénario 3 La chaîne d’entrée n’est pas un type défini dans un fichier WinMD examiné
  • Valeur retournée

    RO_E_METADATA_NAME_NOT_FOUND

  • Paramètre de sortie du chemin d’accès au fichier de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur nullptr

  • Référence au paramètre de sortie de l’objet lecteur de métadonnées

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur nullptr

  • Paramètre de sortie de jeton Typedef

    Il s’agit d’un paramètre de sortie facultatif. S’il n’est pas défini sur nullptr par l’appelant, il est défini sur mdTypeDefNil.

 

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