Функция RoGetMetaDataFile (rometadataresolution.h)
Находит и извлекает файл метаданных, описывающий двоичный интерфейс приложения (ABI) для указанного имени типа.
Синтаксис
HRESULT RoGetMetaDataFile(
[in] const HSTRING name,
[in, optional] IMetaDataDispenserEx *metaDataDispenser,
[out, optional] HSTRING *metaDataFilePath,
[out, optional] IMetaDataImport2 **metaDataImport,
[out, optional] mdTypeDef *typeDefToken
);
Параметры
[in] name
Тип: const HSTRING
Имя, необходимое для разрешения, имя типа или пространство имен. Входная строка имени должна быть непустой и не должна содержать внедренные символы NUL. Если имя является строкой, разделенной точками, подстрока слева от последней точки и подстрока справа от последней точки должны быть непустой.
[in, optional] metaDataDispenser
Тип: IMetaDataDispenserEx*
Диспенсер метаданных, который вызывающий объект может при необходимости передать для функции RoGetMetaDataFile , чтобы иметь возможность открывать файлы метаданных с помощью предоставленного метода IMetaDataDispenserEx::OpenScope . Если параметру диспенсера метаданных присвоено значение nullptr, функция создает внутренний экземпляр средства чтения метаданных с рефакторингом (RoMetadata.dll) и использует его метод IMetaDataDispenserEx::OpenScope . Вы можете создать диспенсер метаданных с помощью функции MetaDataGetDispenser .
[out, optional] metaDataFilePath
Тип: HSTRING*
Абсолютный путь к файлу метаданных (WINMD), который описывает ABI, если не задано значение nullptr. Вызывающий объект отвечает за освобождение HSTRING путем вызова метода WindowsDeleteString .
[out, optional] metaDataImport
Тип: IMetaDataImport2**
Указатель на объект средства чтения файла метаданных. Если вызывающий объект передает значение nullptr , функция освобождает ссылку IMetaDataImport2 , в противном случае вызывающий объект должен освободить ссылку. При сбое задано значение nullptr .
[out, optional] typeDefToken
Тип: mdTypeDef*
Если входная строка имени успешно разрешается как имя типа, для этого параметра устанавливается токен имени типа.
В случае сбоя этому параметру присваивается значение mdTypeDefNil.
Возвращаемое значение
Тип: HRESULT
Эта функция может возвращать одно из этих значений.
Код возврата | Описание |
---|---|
|
Разрешение выполнено успешно. Это означает, что входная строка представляет тип, определенный в WINMD-файле. |
|
По крайней мере одно из следующих свойств входной строки имени не содержит:
|
|
Входная строка не является типом, определенным в любом проверенном WINMD-файле. |
|
Входная строка — это существующее пространство имен, а не имя типа. |
Комментарии
Вызывающий объект может при необходимости передать диспенсер метаданных для функции RoGetMetaDataFile , чтобы открыть файлы метаданных с помощью метода IMetaDataDispenserEx::OpenScope .
Если параметру диспенсера метаданных присвоено значение nullptr, функция создает внутренний экземпляр средства чтения метаданных с рефакторингом и использует метод IMetaDataDispenserEx::OpenScope этого средства чтения.
Функция RoGetMetaDataFile гарантированно будет потокобезопасной, если передать nullptr в параметр диспенсера метаданных, так как функция создает внутреннее средство чтения метаданных только для чтения. Эта гарантия также сохраняется при передаче в функцию средства чтения метаданных только для чтения, например RoMetadata.
Все три выходных параметра являются необязательными, и ни один из них не должен быть указан. Вызов функции RoGetMetaDataFile с nullptr для всех выходных параметров эквивалентен запросу о том, определено ли имя входного типа или пространство имен.
Ссылка на объект средства чтения метаданных и параметры токена TypeDef связаны, поэтому оба объекта должны быть установлены вместе или иметь значение nullptr.
Существует три возможных сценария разрешения типов:
Сценарий 1 |
Входная строка typename — это тип, определенный в файле WinMD.
|
Сценарий 2 | Входная строка typename фактически является существующим пространством имен, а не именем типа.
|
Сценарий 3 | Входная строка не является типом, определенным в любом проверенном файле WinMD.
|
Функция RoGetMetaDataFile разрешает группу интерфейсов, так как она также является именем типа с указанием пространства имен. Метод IInspectable::GetRuntimeClassName возвращает строку в формате строки с разделительной точкой для использования в RoGetMetaDataFile.
Разрешение сторонних типов из процесса, который отсутствует в приложении Магазина Windows, не поддерживается. В этом случае функция возвращает ошибку HRESULT_FROM_WIN32(ERROR_NO_PACKAGE) и задает для выходных параметров значение nullptr. Но типы Windows разрешаются в процессе, который не находится в приложении Магазина Windows.
Примеры
В следующем примере C++ показано, как использовать функцию RoGetMetaDataFile для поиска файла метаданных для указанного имени типа.
#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;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8 [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2012 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | rometadataresolution.h |
Библиотека | WindowsApp.lib |
DLL | WinTypes.dll |