RoGetMetaDataFile-Funktion (rometadataresolution.h)
Sucht und ruft die Metadatendatei ab, die die Application Binary Interface (ABI) für den angegebenen Typnamen beschreibt.
Syntax
HRESULT RoGetMetaDataFile(
[in] const HSTRING name,
[in, optional] IMetaDataDispenserEx *metaDataDispenser,
[out, optional] HSTRING *metaDataFilePath,
[out, optional] IMetaDataImport2 **metaDataImport,
[out, optional] mdTypeDef *typeDefToken
);
Parameter
[in] name
Typ: const HSTRING
Der aufzulösde Name, entweder ein Typname oder ein Namespace. Die Namenseingabezeichenfolge darf nicht leer sein und darf keine eingebetteten NUL-Zeichen enthalten. Wenn der Name eine durch Punkt getrennte Zeichenfolge ist, muss die Teilzeichenfolge links vom letzten Punkt und die Teilzeichenfolge rechts vom letzten Punkt nicht leer sein.
[in, optional] metaDataDispenser
Typ: IMetaDataDispenserEx*
Ein Metadatenspender, den der Aufrufer optional für die RoGetMetaDataFile-Funktion übergeben kann, um die Metadatendateien über die bereitgestellte IMetaDataDispenserEx::OpenScope-Methode öffnen zu können. Wenn der Parameter des Metadatenspenders auf nullptr festgelegt ist, erstellt die Funktion eine interne instance des umgestalteten Metadatenlesers (RoMetadata.dll) und verwendet die IMetaDataDispenserEx::OpenScope-Methode. Sie können mithilfe der MetaDataGetDispenser-Funktion einen Metadatenspender erstellen.
[out, optional] metaDataFilePath
Typ: HSTRING*
Der absolute Pfad der Metadatendatei (.winmd), die die ABI beschreibt, sofern nicht auf nullptr festgelegt. Der Aufrufer ist für die Freigabe des HSTRING durch Aufrufen der WindowsDeleteString-Methode verantwortlich.
[out, optional] metaDataImport
Typ: IMetaDataImport2**
Ein Zeiger auf das Metadatendateileseobjekt. Wenn der Aufrufer einen Nullptr übergibt, gibt die Funktion den IMetaDataImport2-Verweis frei, andernfalls muss der Aufrufer den Verweis freigeben. Der Wert wird bei Einem Fehler auf NULLptr festgelegt.
[out, optional] typeDefToken
Typ: mdTypeDef*
Wenn die Namenseingabezeichenfolge erfolgreich als Typname aufgelöst wurde, wird dieser Parameter auf das Token des Typnamens festgelegt.
Bei Einem Fehler wird dieser Parameter auf mdTypeDefNil festgelegt.
Rückgabewert
Typ: HRESULT
Diese Funktion kann einen dieser Werte zurückgeben.
Rückgabecode | BESCHREIBUNG |
---|---|
|
Die Lösung war erfolgreich. Dies bedeutet, dass die Eingabezeichenfolge einen Typ darstellt, der in einer WINMD-Datei definiert ist. |
|
Mindestens eine der folgenden Eigenschaften der Eingabenamenzeichenfolge enthält nicht:
|
|
Die Eingabezeichenfolge ist kein Typ, der in einer überprüften WINMD-Datei definiert ist. |
|
Die Eingabezeichenfolge ist ein vorhandener Namespace und kein Typname. |
Hinweise
Der Aufrufer kann optional einen Metadatenspender für die RoGetMetaDataFile-Funktion übergeben, um die Metadatendateien über die IMetaDataDispenserEx::OpenScope-Methode zu öffnen.
Wenn der Parameter des Metadatenspenders auf nullptr festgelegt ist, erstellt die Funktion eine interne instance des umgestalteten Metadatenlesers und verwendet die IMetaDataDispenserEx::OpenScope-Methode dieses Readers.
Die RoGetMetaDataFile-Funktion ist garantiert threadsicher, wenn Sie nullptr an den Metadatenspenderparameter übergeben, da die Funktion einen internen schreibgeschützten Metadatenleser erstellt. Diese Garantie gilt auch, wenn Sie den schreibgeschützten Metadatenleser wie RoMetadata an die Funktion übergeben.
Alle drei Ausgabeparameter sind optional, und keiner von ihnen muss angegeben werden. Das Aufrufen der RoGetMetaDataFile-Funktion mit nullptr für alle Ausgabeparameter entspricht der Frage, ob der Eingabetypname oder -namespace definiert ist.
Der Metadatenleserobjektverweis und die TypeDef-Tokenparameter sind gekoppelt, sodass beide zusammen oder auf nullptr festgelegt werden müssen.
Es gibt drei mögliche Typauflösungsszenarien:
Szenario Nr. 1 |
Die Typename-Eingabezeichenfolge ist ein typ, der in einer WinMD-Datei definiert ist.
|
Szenario Nr. 2 | Die Typename-Eingabezeichenfolge ist eigentlich ein vorhandener Namespace und kein Typname.
|
Szenario Nr. 3 | Die Eingabezeichenfolge ist kein Typ, der in einer überprüften WinMD-Datei definiert ist.
|
Die RoGetMetaDataFile-Funktion löst eine Schnittstellengruppe auf, da die Schnittstellengruppe auch ein namespacequalifizierter Typname ist. Die IInspectable::GetRuntimeClassName-Methode gibt die Zeichenfolge im durch Punkt getrennten Zeichenfolgenformat zur Verwendung durch RoGetMetaDataFile zurück.
Das Auflösen von Drittanbietertypen aus einem Prozess, der sich nicht in einer Windows Store-App befindet, wird nicht unterstützt. In diesem Fall gibt die Funktion error HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) zurück und legt ausgabeparameter auf nullptr fest. Windows-Typen werden jedoch in einem Prozess aufgelöst, der sich nicht in einer Windows Store-App befindet.
Beispiele
Im folgenden C++-Beispiel wird gezeigt, wie die RoGetMetaDataFile-Funktion verwendet wird, um die Metadatendatei für einen angegebenen Typnamen zu finden.
#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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 8 [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2012 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | rometadataresolution.h |
Bibliothek | WindowsApp.lib |
DLL | WinTypes.dll |