共用方式為


RoParseTypeName 函式 (rometadataresolution.h)

剖析型別名稱和現有型別參數,如果是參數化型別,則為 。

語法

HRESULT RoParseTypeName(
  [in]  HSTRING typeName,
  [out] DWORD   *partsCount,
        HSTRING **typeNameParts
);

參數

[in] typeName

類型: HSTRING

字串編碼的 typename。 typename 可以是非命名空間限定型別、非參數化命名空間限定型別或完整具現化命名空間限定參數化型別。

[out] partsCount

類型: DWORD*

typenameParts 陣列中的元素數目。

typeNameParts

類型: HSTRING**

陣列的第一個元素是指定的型別,而其餘的陣列元素則是 (,如果預先走動樹狀結構順序有任何) ,則為類型參數。

傳回值

類型: HRESULT

此函式可以傳回其中一個值。

傳回碼 描述
S_OK
剖析成功。
E_INVALIDARG
typeName 包含內嵌的 Null 或是空的。
RO_E_METADATA_INVALID_TYPE_FORMAT
typename 格式不正確。

備註

RoParseTypeName 函式會剖析字串編碼的類型名稱,並傳回 HSTRING 值的陣列。 陣列的第一個元素是基底類型,而其餘的陣列元素則是類型參數,如果有的話,以預先排序的樹狀結構周遊順序。 如果剖析成功,則會傳回S_OK

以下是不同可能輸入類型名稱的範例:

  • 範例 1 (非命名空間限定型別)
    • 輸入 typename

      字串

    • 輸出

      陣列元素 0:字串

  • 範例 2 (非參數化命名空間限定型別)
    • 輸入 typename

      Windows.Foundation.IExtensionInformation

    • 輸出

      陣列元素 0:Windows.Foundation.IExtensionInformation

  • 範例 3 (具現化參數化介面類型)
    • 輸入 typename

      Windows.Foundation.Collections.IIterator1&lt;Windows.Foundation.Collections.IMapView2<Windows.Foundation.Collections.IVector'1<String, String>>>

    • 輸出

      陣列元素 0:Windows.Foundation.Collections.IIterator'1

      陣列元素 1:Windows.Foundation.Collections.IMapView'2

      陣列元素 2:Windows.Foundation.Collections.IVector'1

      陣列元素 3:字串

      陣列元素 4:字串

剖析非參數化型別時, RoParseTypeName 函式會傳回具有一個元素的陣列。 請參閱上述範例 1 和範例 2。

輸入字串必須是非空白的,而且不能包含任何內嵌的 Null 字元。 否則,API 會因為 E_INVALIDARG而失敗。 如果 typename 的格式不正確,例如 IVector'1<,則 API 將會失敗,並 出現RO_E_METADATA_INVALID_TYPE_FORMAT 錯誤碼。

RoParseTypeName 函式只會驗證 typename 的格式,而不是其語法。 例如,函式會驗證命名空間限定參數化介面 typename 遵循下表所示的格式,但不會對 typename 中使用的字元/符號施加任何需求,不同之處在於它不應該包含 ' 、 <或 > 字元。

字串編碼具現化參數化介面的格式如下:

參數化介面的名稱 反引號字元 (') 類型參數數目 左角括弧 (<) 每個類型參數的命名空間限定名稱,並以逗號分隔。 右角括弧 (>)
 

類型參數可能是:

  • 非參數化、非命名空間限定型別,例如 WinRT 基本類型。
  • 非參數化的命名空間限定型別。
  • 完整具現化的命名空間限定參數化介面。
成功時,呼叫端會負責解除分配 RoParseTypeName 所傳回的 typenameParts 陣列,方法是使用 CoTaskMemFree 釋放數位,並釋放 WindowsDeleteString 以釋放 HSTRING 值。

範例

下列 C++ 範例示範如何使用 RoParseTypeName 函式來尋找指定型別名稱的直接子命名空間。

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

HRESULT PrintParameterizedInterfaceParts(PCWSTR pszTypename);

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

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

    HRESULT hr = PrintParameterizedInterfaceParts(argv[1]);

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

HRESULT PrintParameterizedInterfaceParts(PCWSTR pszTypename)
{
    HRESULT hr;
    HSTRING hstrTypeName = nullptr;
    HSTRING *phstrNameParts = nullptr;
    DWORD cRetrievedNameParts = 0;

    hr = WindowsCreateString(
        pszTypename,
        static_cast<UINT32>(wcslen(pszTypename)),
        &hstrTypeName);

    if (SUCCEEDED(hr))
    {
        hr = RoParseTypeName(
            hstrTypeName,
            &cRetrievedNameParts,
            &phstrNameParts);
    }

    if (SUCCEEDED(hr))
    {
        wprintf(L"Parameterized interface %s is composed of:\n", pszTypename);

        for (UINT32 i = 0; i < cRetrievedNameParts; i++)
        {
            wprintf(L"Element %d: %s\n", i, WindowsGetStringRawBuffer(phstrNameParts[i], nullptr));
        }
    }
    else
    {
        wprintf(L"Invalid parameterized interface syntax: %s!\n", pszTypename);
    }

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

    for (UINT32 i = 0; i < cRetrievedNameParts; i++)
    {
        WindowsDeleteString(phstrNameParts[i]);
    }

    CoTaskMemFree(phstrNameParts);

    return hr;
}

規格需求

需求
最低支援的用戶端 Windows 8 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2012 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 rometadataresolution.h
程式庫 WinTypes.lib
Dll WinTypes.dll