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
S_OK
Die Analyse war erfolgreich.
E_INVALIDARG
typeName enthält eingebettete NULL-Werte oder ist leer.
RO_E_METADATA_INVALID_TYPE_FORMAT
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

  • Beispiel 2 (nicht parametrisierter namespacequalifizierter Typ)
    • Eingabetypname

      Windows.Foundation.IExtensionInformation

    • Ausgabe

      Arrayelement 0: Windows.Foundation.IExtensionInformation

  • Beispiel 3 (instanziierter parametrisierter Schnittstellentyp)
    • Eingabetypname

      Windows.Foundation.Collections.IIterator1&lt;Windows.Foundation.Collections.IMapView2<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

Beim Analysieren eines nicht parametrisierten Typs gibt die RoParseTypeName-Funktion ein Array zurück, das über ein Element verfügt. Siehe Beispiel 1 und Beispiel 2 oben.

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.
Bei Erfolg ist der Aufrufer für die Zuordnung des typnameParts-Arrays verantwortlich, das von RoParseTypeName zurückgegeben wird, indem er CoTaskMemFree verwendet, um das Array und WindowsDeleteString freizugeben, um die HSTRING-Werte freizugeben.

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