Função RoParseTypeName (rometadataresolution.h)
Analisa um nome de tipo e parâmetros de tipo existentes, no caso de tipos parametrizados.
Sintaxe
HRESULT RoParseTypeName(
[in] HSTRING typeName,
[out] DWORD *partsCount,
HSTRING **typeNameParts
);
Parâmetros
[in] typeName
Tipo: HSTRING
Nome do tipo codificado em cadeia de caracteres. O typename pode ser um tipo não qualificado por namespace, um tipo qualificado por namespace não parametrizado ou um tipo parametrizado totalmente instanciado qualificado por namespace.
[out] partsCount
Tipo: DWORD*
Número de elementos na matriz typenameParts .
typeNameParts
Tipo: HSTRING**
O primeiro elemento da matriz é o tipo especificado e os elementos de matriz restantes são os parâmetros de tipo (se houver) na ordem de árvore pré-caminhada.
Retornar valor
Tipo: HRESULT
Essa função pode retornar um desses valores.
Código de retorno | Descrição |
---|---|
|
A análise foi bem-sucedida. |
|
typeName contém nulos inseridos ou está vazio. |
|
typename não está bem formado. |
Comentários
A função RoParseTypeName analisa o nome do tipo codificado em cadeia de caracteres e retorna uma matriz de valores HSTRING . O primeiro elemento da matriz é o tipo base e os elementos de matriz restantes são os parâmetros de tipo, se houver, na ordem de passagem de árvore de pré-encomenda. S_OK será retornado se a análise tiver sido bem-sucedida.
Aqui estão exemplos de diferentes nomes de tipo de entrada possíveis:
-
Exemplo 1 (tipo não qualificado para namespace)
-
Nome do tipo de entrada
Cadeia de caracteres
-
Saída
Elemento de matriz 0: Cadeia de caracteres
-
Nome do tipo de entrada
-
Exemplo 2 (tipo qualificado para namespace não parametrizado)
-
Nome do tipo de entrada
Windows.Foundation.IExtensionInformation
-
Saída
Elemento array 0: Windows.Foundation.IExtensionInformation
-
Nome do tipo de entrada
-
Exemplo 3 (tipo de interface parametrizada instanciada)
-
Nome do tipo de entrada
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<Windows.Foundation.Collections.IVector'1<String>, String>> -
Saída
Elemento array 0: Windows.Foundation.Collections.IIterator'1
Elemento array 1: Windows.Foundation.Collections.IMapView'2
Elemento de matriz 2: Windows.Foundation.Collections.IVector'1
Elemento de matriz 3: Cadeia de caracteres
Elemento De matriz 4: Cadeia de caracteres
-
Nome do tipo de entrada
A cadeia de caracteres de entrada deve não estar vazia e não deve conter caracteres nulos inseridos. Caso contrário, a API falhará com E_INVALIDARG. Se o typename estiver mal formado, como IVector'1<, a API falhará com o código de erro RO_E_METADATA_INVALID_TYPE_FORMAT .
A função RoParseTypeName valida apenas o formato do typename e não sua sintaxe. Por exemplo, a função valida que um nome de tipo de interface parametrizado qualificado por namespace segue o formato mostrado na tabela a seguir, mas não impõe nenhum requisito sobre quais caracteres/símbolos podem ser usados no nome do tipo, exceto que ele não deve conter caracteres , <ou > .
O formato de uma interface parametrizada com codificação de cadeia de caracteres com instância é o seguinte:
Nome da interface parametrizada | Caractere de acento grave (') | Número de parâmetros de tipo | Colchete angular esquerdo (<) | Nome qualificado do namespace de cada parâmetro de tipo, separado por vírgulas. | Colchete angular direito (>) |
Os parâmetros de tipo podem ser:
- Tipos não parametrizados, não qualificados por namespace, como tipos fundamentais do WinRT.
- Tipos qualificados para namespace não parametrizados.
- Interfaces parametrizadas totalmente instanciadas qualificadas por namespace.
Exemplos
O exemplo C++ a seguir mostra como usar a função RoParseTypeName para localizar os namespaces filho diretos para um nome de tipo especificado.
#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;
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 8 [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2012 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | rometadataresolution.h |
Biblioteca | WinTypes.lib |
DLL | WinTypes.dll |