Share via


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

選擇性參數,其中包含 SDK 目錄的路徑,以搜尋元數據 (.winmd) 檔案。

如果未指定此參數, (空白或 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 輸出參數,但找不到指定命名空間的元數據檔案和子名稱空間。
  • 僅會設定metaDataFilePaths,但找不到指定命名空間的元數據檔案。
  • subNamespaces 只會設定,但找不到指定命名空間的子名稱空間。
E_INVALIDARG
指出下列其中一項:
  • 未設定 metaDataFilePathssubNamespaces
  • 命名空間名稱具有內嵌的 Null 字元。
  • 命名空間是空的或 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
程式庫 WinTypes.lib
Dll WinTypes.dll