RoResolveNamespace 函数 (rometadataresolution.h)

从Windows 运行时支持的任何编程语言中确定指定Windows 运行时命名空间的直接子级、类型和子命名空间。

语法

HRESULT RoResolveNamespace(
  [in, optional]  const HSTRING name,
  [in, optional]  const HSTRING windowsMetaDataDir,
  [in]            const DWORD   packageGraphDirsCount,
  [in, optional]  const HSTRING *packageGraphDirs,
  [out, optional] DWORD         *metaDataFilePathsCount,
  [out, optional] HSTRING       **metaDataFilePaths,
  [out, optional] DWORD         *subNamespacesCount,
  [out, optional] HSTRING       **subNamespaces
);

参数

[in, optional] name

类型: const HSTRING

尝试检索其直接子级的完整命名空间。 这是必需参数。

如果此命名空间为空或 nullptr则 RoResolveNamespace 函数将返回顶级命名空间。 Windows 和其他顶级命名空间都在包图中。

[in, optional] windowsMetaDataDir

类型: const HSTRING

可选参数,其中包含用于搜索元数据 (.winmd) 文件的 SDK 目录路径。

如果未 (空或 nullptr) 指定此参数,则函数在默认 Windows 元数据目录 %windir%\System32\WinMetadata 中搜索。

[in] packageGraphDirsCount

类型: const DWORD

packageGraphDirs 数组中的路径计数。

[in, optional] packageGraphDirs

类型: const HSTRING*

显式包依赖项关系图数组中的包路径计数。 如果 packageGraphDirsnullptr,则忽略计数。

[out, optional] metaDataFilePathsCount

类型: DWORD*

metaDataFilePaths 数组中的元数据文件计数。

[out, optional] metaDataFilePaths

类型: HSTRING**

可选输出参数,其中包含所有元数据 (.winmd) 可能包含 直接名称子级的文件的被调用方分配的绝对文件路径数组。

[out, optional] subNamespacesCount

类型: DWORD*

subNamespaces 数组中的元数据文件计数。

[out, optional] subNamespaces

类型: HSTRING**

可选输出参数,其中包含给定命名空间的直接子级名称的被调用方分配的数组。 此列表是其他子空间的提示,不一定完整。

返回值

类型: HRESULT

此函数可以返回其中一个值。

返回代码 说明
S_OK
命名空间直接子级解析成功,这意味着至少找到了一个文件或一个子空间名称。
RO_E_METADATA_NAME_NOT_FOUND
指示以下情况之一:
  • 已设置 metaDataFilePathssubNamespaces 输出参数,但未找到给定命名空间的元数据文件和 subnamespace。
  • 仅设置了 metaDataFilePaths,但找不到给定命名空间的元数据文件。
  • 仅设置了 subNamespaces,但未找到给定命名空间的 subnamespace。
E_INVALIDARG
指示以下情况之一:
  • metaDataFilePathssubNamespaces 均未设置。
  • 命名空间名称包含嵌入的空字符。
  • 命名空间为空或 NULL ,并且未设置 subNamespaces
  • 命名空间为空或 NULL ,并且已设置 metaDataFilePaths

注解

使用 RoResolveNamespace 函数浏览Windows 运行时命名空间层次结构。

示例

以下 C++ 示例演示如何使用 RoResolveNamespace 函数查找指定类型名称的直接子命名空间。

#include <windows.h>
#include <stdio.h>
#include <WinRTString.h>
#include <TypeResolution.h>
#include <atlbase.h>

HRESULT PrintDirectChildrenSubNamespacesAndTypesPaths(PCWSTR pszName);

int ShowUsage()
{
    wprintf(L"Usage: RoResolveNamespaceSample TypeName\n");
    return -1;
}

int __cdecl wmain(int argc, WCHAR **argv)
{
    if (argc != 2)
    {
        return ShowUsage();
    }

    HRESULT hr = PrintDirectChildrenSubNamespacesAndTypesPaths(argv[1]);

    if (SUCCEEDED(hr))
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

HRESULT PrintDirectChildrenSubNamespacesAndTypesPaths(PCWSTR pszName)
{
    HRESULT hr;
    HSTRING hstrName = nullptr;
    DWORD cRetrievedSubNamespaces = 0;
    HSTRING *phstrRetrievedSubNamespaces = nullptr;
    DWORD cRetrievedMetaDataFilePaths = 0;
    HSTRING *phstrRetrievedMetaDataFiles = nullptr;

    hr = WindowsCreateString(
        pszName,
        static_cast<UINT32>(wcslen(pszName)),
        &hstrName);

    if (SUCCEEDED(hr))
    {
        hr = RoResolveNamespace(
            hstrName,
            nullptr,
            0,
            nullptr,
            &cRetrievedMetaDataFilePaths,
            &phstrRetrievedMetaDataFiles,
            &cRetrievedSubNamespaces,
            &phstrRetrievedSubNamespaces);
    }

    if (SUCCEEDED(hr))
    {
        if (cRetrievedSubNamespaces != 0)
        {
            wprintf(L"Direct-children subnamespaces of %s are:\n", pszName);

            for (DWORD i = 0; i < cRetrievedSubNamespaces; i++)
            {
                wprintf(L"Subnamespace %d: %s\n", i, WindowsGetStringRawBuffer(phstrRetrievedSubNamespaces[i], nullptr));
            }
        }

        if (cRetrievedMetaDataFilePaths != 0)
        {
            wprintf(L"Potential direct-children types of %s could be found in:\n", pszName);

            for (DWORD i = 0; i < cRetrievedMetaDataFilePaths; i++)
            {
                wprintf(L"Metadata file path %d: %s\n", i, WindowsGetStringRawBuffer(phstrRetrievedMetaDataFiles[i], nullptr));
            }
        }
    }
    else if (hr == RO_E_METADATA_NAME_NOT_FOUND)
    {
        wprintf(L"Name %s was not found!\n", pszName);
    }
    else
    {
        wprintf(L"Error %x occurred while trying to resolve %s!\n", hr, pszName);
    }

    // Clean up resources.
    if (hstrName != nullptr)
    {
        WindowsDeleteString(hstrName);
    }

    for (DWORD i = 0; i < cRetrievedSubNamespaces; i++)
    {
        WindowsDeleteString(phstrRetrievedSubNamespaces[i]);
    }

    CoTaskMemFree(phstrRetrievedSubNamespaces);

    for (DWORD i = 0; i < cRetrievedMetaDataFilePaths; i++)
    {
        WindowsDeleteString(phstrRetrievedMetaDataFiles[i]);
    }
    
    CoTaskMemFree(phstrRetrievedMetaDataFiles);

    return hr;
}

要求

要求
最低受支持的客户端 Windows 8 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows Server 2012 [桌面应用 |UWP 应用]
目标平台 Windows
标头 rometadataresolution.h
Library WinTypes.lib
DLL WinTypes.dll