Nicht-skalare Typen registrieren

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Nicht-skalare Typen in aufrufbaren Interfaces verwenden


Eine aufrufbare Schnittstelle kann erst dann Typen verwenden, die nicht zu den integrierten skalaren Typen gehören, die unter Nicht-skalare Typen in aufrufbaren Schnittstellen verwenden aufgeführt sind, nachdem diese Typen von der Anwendung in der Remotable-Typ-Registrierung registriert wurden. Um auf die Remotable-Typ-Registrierung zugreifen zu können, müssen Sie der uses-Klausel die Unit InvokeRegistry hinzufügen. Diese Unit deklariert eine globale Funktion namens RemTypeRegistry, die eine Referenz auf die Remotable-Typ-Registrierung zurückgibt.

Hinweis:  Auf Clients wird der Code zum Registrieren von Typen in der Remotable-Typ-Registrierung automatisch generiert, sobald Sie ein WSDL-Dokument importieren. Auf Servern werden Remotable-Typen automatisch registriert, wenn Sie eine Schnittstelle registrieren, welche diese Typen verwendet. Das explizite Hinzufügen von Code zum Registrieren von Typen ist nur dann erforderlich, wenn Sie den Namespace oder Typennamen selbst angeben möchten, anstatt die automatisch generierten Werte zu verwenden.

Die Remotable-Typ-Registrierung bietet zwei Methoden, die Ihnen zum Registrieren von Typen zur Verfügung stehen: RegisterXSInfo und RegisterXSClass. Die erste (RegisterXSInfo) ermöglicht die Registrierung eines dynamischen Arrays oder einer anderen Typdefinition. Die zweite (RegisterXSClass) dient der Registrierung von Remotable-Klassen, die Sie zur Repräsentation anderer Typen definieren.

Bei Verwendung von dynamischen Arrays oder Aufzählungstypen kann die Aufruf-Registrierung die erforderlichen Informationen den vom Compiler generierten Typinformationen entnehmen. Die Schnittstelle könnte daher beispielsweise einen Typ wie den folgenden verwenden:

type
  TDateTimeArray = array of TXSDateTime;
typedef DynamicArray<TXSDateTime> TDateTimeArray;

Dieser Typ wird automatisch registriert, sobald Sie die aufrufbare Schnittstelle registrieren. Wenn Sie jedoch den Namespace angeben möchten, in dem der Typ definiert ist, oder den Namen des Typs, müssen Sie Quelltext hinzufügen, um den Typ mit der Methode RegisterXSInfo der Remotable-Typ-Registrierung explizit zu registrieren.

Die Registrierung erfolgt im Initialisierungsabschnitt der Unit, in der Sie das dynamische Array deklarieren bzw. verwenden:

RemTypeRegistry.RegisterXSInfo(TypeInfo(TDateTimeArray), MyNameSpace, 'DTarray', 'DTarray');
void RegTypes()
{
  RemTypeRegistry()->RegisterXSInfo(__arraytypeinfo(TDateTimeArray),
        MyNameSpace, "DTarray", "DTarray");
  InvRegistry()->RegisterInterface(__delphirtti(ITimeServices));
}

Der erste Parameter von RegisterXSInfo bezieht sich auf die Typinformationen für den Typ, den Sie registrieren. Der zweite Parameter stellt den Namespace-URI für den Namespace dar, in dem der Typ definiert ist. Wenn Sie diesen Parameter weglassen oder einen leeren String angeben, wird ein Namespace von der Registrierung generiert. Der dritte Parameter ist der Name des Typs im programmeigenen Quelltext. Wenn Sie diesen Parameter weglassen oder einen leeren String angeben, extrahiert die Registrierung den Typnamen aus den Typinformationen, die Sie als ersten Parameter angegeben haben. Im letzten Parameter wird der Name des Typs so angegeben, wie er in WSDL-Dokumenten erscheint. Wenn Sie diesen Parameter weglassen oder einen leeren String angeben, zieht die Registrierung den programmeigenen Typnamen (also den dritten Parameter) heran.

Das Vorgehen zum Registrieren einer Remotable-Klasse ist ähnlich, mit dem Unterschied, dass Sie anstelle eines Typinformationszeigers eine Klassenreferenz angeben. Die folgende Zeile stammt beispielsweise aus der Unit XSBuiltIns. Sie registriert TXSDateTime, einen Nachkommen von TRemotable, der Werte von TDateTime repräsentiert:

RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, 'dateTime', ,True);
void RegTypes()
{
  RemTypeRegistry()->RegisterXSclass(__classid(TXSDateTime), XMLSchemaNameSpace, "dateTime", "", true);
  InvRegistry()->RegisterInterface(__delphirtti(ITimeServices));
}

Der erste Parameter stellt die Klassenreferenz für die Remotable-Klasse dar, die den Typ repräsentiert. Der zweite ist ein URI (Uniform Resource Identifier), durch den der Namespace der neuen Klasse eindeutig identifiziert wird. Wenn Sie einen leeren String angeben, wird von der Registrierung ein URI generiert. Der dritte und vierte Parameter geben den programmeigenen und den externen Namen des Datentyps an, den die Klasse repräsentiert. Wird der vierte Parameter weggelassen, zieht die Typregistrierung für beide Werte den dritten Parameter heran. Wenn Sie für beide Parameter einen leeren String angeben, verwendet die Registrierung den Klassennamen. Durch den fünften Parameter wird angegeben, ob der Wert der Klasseninstanzen als String übertragen werden kann. Wahlweise können Sie einen sechsten Parameter hinzufügen (nicht im obigen Beispiel enthalten), um festzulegen, wie mehrere Referenzen auf dieselbe Objektinstanz in SOAP-Paketen repräsentiert werden sollen.

Siehe auch