次の方法で共有


RoParseTypeName 関数 (rometadataresolution.h)

パラメーター化された型の場合は、型名と既存の型パラメーターを解析します。

構文

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

パラメーター

[in] typeName

型: HSTRING

文字列エンコード型名。 型名には、名前空間以外の修飾型、パラメーター化されていない名前空間修飾型、または完全にインスタンス化された名前空間修飾型を指定できます。

[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 (名前空間以外の修飾型)
    • 入力型名

      文字列

    • 出力

      配列要素 0: String

  • 例 2 (パラメーター化されていない名前空間修飾型)
    • 入力型名

      Windows.Foundation.IExtensionInformation

    • 出力

      配列要素 0: Windows.Foundation.IExtensionInformation

  • 例 3 (インスタンス化されたパラメーター化されたインターフェイス型)
    • 入力型名

      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: String

パラメーター化されていない型を解析する場合、 RoParseTypeName 関数は 1 つの要素を持つ配列を返します。 上記の例 1 と例 2 を参照してください。

入力文字列は空でなく、埋め込み null 文字を含めてはなりません。 それ以外の場合、API は E_INVALIDARGで失敗します。 IVector'1< のように型名が正しくない場合、API はRO_E_METADATA_INVALID_TYPE_FORMATエラー コードで失敗します。

RoParseTypeName 関数は、型名の形式のみを検証し、構文は検証しません。 たとえば、 関数は、名前空間で修飾されたパラメーター化されたインターフェイス の型名 が次の表に示す形式に従っていることを検証しますが、 型名で使用できる文字/シンボルに関する要件はありませんが、' 、、 <、または > 文字を含めないようにする必要があります。

文字列エンコードされたインスタンス化されたパラメーター化インターフェイスの形式は次のとおりです。

パラメーター化されたインターフェイスの名前 バックティック文字 (') 型パラメーターの数 左山かっこ (<) コンマで区切られた各型パラメーターの名前空間修飾名。 終わり山かっこ (>)
 

型パラメーターは次のようになります。

  • WinRT の基本型など、パラメーター化されていない名前空間以外の修飾型。
  • パラメーター化されていない名前空間修飾型。
  • 完全修飾名前空間で修飾されたパラメーター化されたインターフェイス。
成功した場合、呼び出し元は、CoTaskMemFree を使用して配列を解放し、WindowsDeleteString を使用して HSTRING 値を解放することで、RoParseTypeName によって返される typenameParts 配列の割り当てを解除します。

次の 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
Library WinTypes.lib
[DLL] WinTypes.dll