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*
描述 ABI 的元数据 (.winmd) 文件的绝对路径,除非设置为 nullptr。 调用方负责通过调用 WindowsDeleteString 方法释放 HSTRING。
[out, optional] metaDataImport
类型: IMetaDataImport2**
指向元数据文件读取器对象的指针。 如果调用方传入 nullptr ,则该函数将释放 IMetaDataImport2 引用,否则调用方必须释放引用。 该值在失败时设置为 nullptr 。
[out, optional] typeDefToken
类型: mdTypeDef*
如果名称输入字符串已成功解析为 typename,则此参数设置为 typename 的标记。
失败时,此参数设置为 mdTypeDefNil。
类型: HRESULT
此函数可以返回其中一个值。
调用方可以选择传递 RoGetMetaDataFile 函数的元数据分配器,通过 IMetaDataDispenserEx::OpenScope 方法打开元数据文件。
如果元数据分配器参数设置为 nullptr,则该函数将创建重构元数据读取器的内部实例,并使用该读取器的 IMetaDataDispenserEx::OpenScope 方法。
如果将 nullptr 传递给元数据分配器参数,则 RoGetMetaDataFile 函数将保证线程安全,因为函数创建内部只读元数据读取器。 如果传入只读元数据读取器(如 RoMetadata)到函数,此保证也会保留此保证。
这三个输出参数都是可选的,不需要指定其中任何参数。 为所有输出参数调用具有 nullptr 的 RoGetMetaDataFile 函数等效于询问是否定义了输入类型名或命名空间。
元数据读取器对象引用和 TypeDef 标记参数配对,因此必须同时设置或设置为 nullptr。
有三种可能的类型解析方案:
场景 #1
Typename 输入字符串是在 WinMD 文件中定义的类型。
返回值S_OK
元数据文件路径输出参数这是可选的输出参数。 如果未通过调用方设置为 nullptr ,它将保存描述给定类型的 ABI 的 .winmd 文件的绝对路径。 调用方负责通过调用 WindowsDeleteString 释放 HSTRING。
对元数据读取器对象输出参数的引用这是可选的输出参数。 如果不是 nullptr,它将保存对元数据读取器对象的引用 (IMetaDataImport2) ,调用方负责释放它。 如果调用方为此参数传递 nullptr ,则表示调用方不希望元数据读取器对象,因此函数释放内部引用。
Typedef 令牌输出参数这是可选的输出参数。 如果未按调用方设置为 nullptr ,则设置为类型 typedef 条目的标记。 语言投影可以使用此令牌调用 IMetaDataImport::GetTypeDefProps 来获取有关该类型的元数据。
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;
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);
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;