RoParseTypeName-Funktion (rometadataresolution.h)
Analysiert einen Typnamen und vorhandene Typparameter im Fall parametrisierter Typen.
Syntax
HRESULT RoParseTypeName(
[in] HSTRING typeName,
[out] DWORD *partsCount,
HSTRING **typeNameParts
);
Parameter
[in] typeName
Typ: HSTRING
Zeichenfolgencodierter Typname. Der Typname kann ein nicht namespacequalifizierter Typ, ein nicht parametrisierter namespacequalifizierter Typ oder ein vollständig instanziierter namespacequalifizierter parametrisierter Typ sein.
[out] partsCount
Typ: DWORD*
Anzahl der Elemente im TypenameParts-Array .
typeNameParts
Typ: HSTRING**
Das erste Element des Arrays ist der angegebene Typ, und die restlichen Arrayelemente sind die Typparameter (falls vorhanden) in der Reihenfolge der Vorlaufstruktur.
Rückgabewert
Typ: HRESULT
Diese Funktion kann einen dieser Werte zurückgeben.
Rückgabecode | BESCHREIBUNG |
---|---|
|
Die Analyse war erfolgreich. |
|
typeName enthält eingebettete NULL-Werte oder ist leer. |
|
typename ist nicht gut formatiert. |
Hinweise
Die RoParseTypeName-Funktion analysiert den zeichenfolgencodierten Typnamen und gibt ein Array von HSTRING-Werten zurück. Das erste Element des Arrays ist der Basistyp, und die restlichen Arrayelemente sind die Typparameter, falls vorhanden, in vorgeordneter Baumdurchlaufreihenfolge. S_OK wird zurückgegeben, wenn die Analyse erfolgreich war.
Hier finden Sie Beispiele für verschiedene mögliche Eingabetypnamen:
-
Beispiel 1 (nicht namespacequalifizierter Typ)
-
Eingabetypname
String
-
Ausgabe
Arrayelement 0: Zeichenfolge
-
Eingabetypname
-
Beispiel 2 (nicht parametrisierter namespacequalifizierter Typ)
-
Eingabetypname
Windows.Foundation.IExtensionInformation
-
Ausgabe
Arrayelement 0: Windows.Foundation.IExtensionInformation
-
Eingabetypname
-
Beispiel 3 (instanziierter parametrisierter Schnittstellentyp)
-
Eingabetypname
Windows.Foundation.Collections.IIterator
1<Windows.Foundation.Collections.IMapView
2<Windows.Foundation.Collections.IVector'1<String>, String>> -
Ausgabe
Arrayelement 0: Windows.Foundation.Collections.IIterator'1
Arrayelement 1: Windows.Foundation.Collections.IMapView'2
Arrayelement 2: Windows.Foundation.Collections.IVector'1
Arrayelement 3: Zeichenfolge
Arrayelement 4: Zeichenfolge
-
Eingabetypname
Die Eingabezeichenfolge muss nicht leer sein und darf keine eingebetteten NULL-Zeichen enthalten. Andernfalls schlägt die API mit E_INVALIDARG fehl. Wenn der Typname falsch formatiert ist, z. B. IVector'1<, schlägt die API mit dem RO_E_METADATA_INVALID_TYPE_FORMAT Fehlercode fehl.
Die RoParseTypeName-Funktion überprüft nur das Format des Typnamens und nicht dessen Syntax. Die Funktion überprüft beispielsweise, ob ein namespacequalifizierter parametrisierter Schnittstellentypname dem in der folgenden Tabelle gezeigten Format folgt, stellt jedoch keine Anforderungen an die Zeichen/Symbole, die im Typnamen verwendet werden können, außer dass er keine Zeichen , <oder > Zeichen enthalten sollte.
Das Format für eine Zeichenfolgencodierte instanziierte parametrisierte Schnittstelle lautet wie folgt:
Name der parametrisierten Schnittstelle | Backtick-Zeichen (') | Anzahl der Typparameter | Klammer links (<) | Namespacequalifizierter Name jedes Typparameters, durch Kommas getrennt. | Rechtwinklige Klammer (>) |
Typparameter können sein:
- Nicht parametrisierte, nicht namespacequalifizierte Typen, z. B. WinRT-Fundamentaltypen.
- Nicht parametrisierte Namespace-qualifizierte Typen.
- Vollständig instanziierte namespacequalifizierte parametrisierte Schnittstellen.
Beispiele
Das folgende C++-Beispiel zeigt, wie Sie die Funktion RoParseTypeName verwenden, um die direkten untergeordneten Namespaces für einen angegebenen Typnamen zu finden.
#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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 8 [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2012 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | rometadataresolution.h |
Bibliothek | WinTypes.lib |
DLL | WinTypes.dll |