RoParseTypeName 関数 (rometadataresolution.h)
パラメーター化された型の場合は、型名と既存の型パラメーターを解析します。
構文
HRESULT RoParseTypeName(
[in] HSTRING typeName,
[out] DWORD *partsCount,
HSTRING **typeNameParts
);
パラメーター
[in] typeName
型: HSTRING
文字列エンコード型名。 型名には、名前空間以外の修飾型、パラメーター化されていない名前空間修飾型、または完全にインスタンス化された名前空間修飾型を指定できます。
[out] partsCount
型: DWORD*
typenameParts 配列内の要素の数。
typeNameParts
型: HSTRING**
配列の最初の要素は指定された型であり、残りの配列要素は、プレウォーク ツリー順の型パラメーター (存在する場合) です。
戻り値
型: HRESULT
この関数は、これらの値のいずれかを返すことができます。
リターン コード | 説明 |
---|---|
|
解析が成功しました。 |
|
typeName に埋め込み null が含まれているか、空です。 |
|
typename は整形式ではありません。 |
注釈
RoParseTypeName 関数は、文字列でエンコードされた型名を解析し、HSTRING 値の配列を返します。 配列の最初の要素は基本型であり、残りの配列要素は、事前順序のツリー トラバーサル順序で型パラメーター (存在する場合) です。 解析 が成功した場合、S_OKが返されます。
さまざまな入力型名の例を次に示します。
-
例 1 (名前空間以外の修飾型)
-
入力型名
文字列
-
出力
配列要素 0: String
-
入力型名
-
例 2 (パラメーター化されていない名前空間修飾型)
-
入力型名
Windows.Foundation.IExtensionInformation
-
出力
配列要素 0: Windows.Foundation.IExtensionInformation
-
入力型名
-
例 3 (インスタンス化されたパラメーター化されたインターフェイス型)
-
入力型名
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<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
-
入力型名
入力文字列は空でなく、埋め込み null 文字を含めてはなりません。 それ以外の場合、API は E_INVALIDARGで失敗します。 IVector'1< のように型名が正しくない場合、API はRO_E_METADATA_INVALID_TYPE_FORMATエラー コードで失敗します。
RoParseTypeName 関数は、型名の形式のみを検証し、構文は検証しません。 たとえば、 関数は、名前空間で修飾されたパラメーター化されたインターフェイス の型名 が次の表に示す形式に従っていることを検証しますが、 型名で使用できる文字/シンボルに関する要件はありませんが、' 、、 <、または > 文字を含めないようにする必要があります。
文字列エンコードされたインスタンス化されたパラメーター化インターフェイスの形式は次のとおりです。
パラメーター化されたインターフェイスの名前 | バックティック文字 (') | 型パラメーターの数 | 左山かっこ (<) | コンマで区切られた各型パラメーターの名前空間修飾名。 | 終わり山かっこ (>) |
型パラメーターは次のようになります。
- WinRT の基本型など、パラメーター化されていない名前空間以外の修飾型。
- パラメーター化されていない名前空間修飾型。
- 完全修飾名前空間で修飾されたパラメーター化されたインターフェイス。
例
次の 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 |