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
此函式可以傳回其中一個值。
傳回碼 | 描述 |
---|---|
|
剖析成功。 |
|
typeName 包含內嵌的 Null 或是空的。 |
|
typename 格式不正確。 |
備註
RoParseTypeName 函式會剖析字串編碼的類型名稱,並傳回 HSTRING 值的陣列。 陣列的第一個元素是基底類型,而其餘的陣列元素則是類型參數,如果有的話,以預先排序的樹狀結構周遊順序。 如果剖析成功,則會傳回S_OK。
以下是不同可能輸入類型名稱的範例:
-
範例 1 (非命名空間限定型別)
-
輸入 typename
字串
-
輸出
陣列元素 0:字串
-
輸入 typename
-
範例 2 (非參數化命名空間限定型別)
-
輸入 typename
Windows.Foundation.IExtensionInformation
-
輸出
陣列元素 0:Windows.Foundation.IExtensionInformation
-
輸入 typename
-
範例 3 (具現化參數化介面類型)
-
輸入 typename
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:字串
-
輸入 typename
輸入字串必須是非空白的,而且不能包含任何內嵌的 Null 字元。 否則,API 會因為 E_INVALIDARG而失敗。 如果 typename 的格式不正確,例如 IVector'1<,則 API 將會失敗,並 出現RO_E_METADATA_INVALID_TYPE_FORMAT 錯誤碼。
RoParseTypeName 函式只會驗證 typename 的格式,而不是其語法。 例如,函式會驗證命名空間限定參數化介面 typename 遵循下表所示的格式,但不會對 typename 中使用的字元/符號施加任何需求,不同之處在於它不應該包含 ' 、 <或 > 字元。
字串編碼具現化參數化介面的格式如下:
參數化介面的名稱 | 反引號字元 (') | 類型參數數目 | 左角括弧 (<) | 每個類型參數的命名空間限定名稱,並以逗號分隔。 | 右角括弧 (>) |
類型參數可能是:
- 非參數化、非命名空間限定型別,例如 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 |
程式庫 | WinTypes.lib |
Dll | WinTypes.dll |