非スカラー型の登録
Web サービスの利用:インデックス への移動
起動可能インターフェースでの非スカラー型の使用にリストされている組み込みスカラー型以外の型を起動可能インターフェイスが使用できるようにするには、アプリケーションがその型をリモート可能タイプ レジストリに登録しなければなりません。リモート可能タイプ レジストリにアクセスするには、uses 節に InvokeRegistry ユニットを追加しなければなりません。このユニットは、リモート可能タイプ レジストリへの参照を返すグローバル関数、RemTypeRegistry を宣言しています。
リモート可能タイプ レジストリには、型登録に使用できるメソッドが 2 つ --- RegisterXSInfo と RegisterXSClass --- があります。最初のメソッド(RegisterXSInfo)では、動的配列やその他の型の定義を登録できます。2 つ目のメソッド(RegisterXSClass)は、他の型を表すために定義した、リモート可能クラスを登録するためのものです。
動的配列や列挙型を使用する場合は、起動レジストリは、必要な情報を、コンパイラが生成した型情報から取得することができます。このため、たとえば、インターフェイスは次のような型を使用できます:
type TDateTimeArray = array of TXSDateTime;
typdef DynamicArray<TXSDateTime> TDateTimeArray;
この型は、起動可能インターフェイスの登録時に、自動的に登録されます。しかし、その型が定義された名前空間や、型の名前を指定したい場合には、リモート可能タイプ レジストリの RegisterXSInfo メソッドを使用して型を明示的に登録するためのコードを追加しなければなりません。 登録は、動的配列を宣言または使用するユニットの、初期化セクションに入ります:
RemTypeRegistry.RegisterXSInfo(TypeInfo(TDateTimeArray), MyNameSpace, 'DTarray', 'DTarray');
void RegTypes() { RemTypeRegistry()->RegisterXSInfo(__arraytypeinfo(TDateTimeArray), MyNameSpace, "DTarray", "DTarray"); InvRegistry()->RegisterInterface(__delphirtti(ITimeServices)); }
RegisterXSInfo の第1パラメータは、登録しようとしている型の型情報です。第2パラメータは、型が定義されている名前空間の、名前空間 URI です。このパラメータを省略するか、空文字列を入れた場合、レジストリは名前空間を代わりに生成してくれます。第3パラメータは、ネイティブコードに表示される型の名前です。このパラメータを省略するか、空文字列を入れた場合、レジストリは、第1パラメータに渡した型情報から型名を使用します。最後のパラメータは、WSDL ドキュメントに表示される型の名前です。このパラメータを省略するか、空文字列を入れた場合、レジストリは、ネイティブの型名(第3パラメータ)を使用します。 リモート可能クラスの登録も同様ですが、型情報ポインタではなく、クラス参照が提供されます。たとえば、次の行は XSBuiltIns ユニットからのものです。これは、TXSDateTime (TDateTime 値を表す TRemotable の下位クラス)を登録します。
RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, 'dateTime', ,True);
void RegTypes() { RemTypeRegistry()->RegisterXSclass(__classid(TXSDateTime), XMLSchemaNameSpace, "dateTime", "", true); InvRegistry()->RegisterInterface(__delphirtti(ITimeServices)); }
第1パラメータは、型を表すリモート可能クラスのクラス参照です。第2パラメータは、新しいクラスの名前空間を識別する、URI(統一リソース識別子)です。空文字列を指定した場合、レジストリが代わりに URI を生成します。第3、第4パラメータは、クラスが表すデータ型の、ネイティブ名および外部名を指定します。第4パラメータを省略した場合、タイプ レジストリは、第3パラメータを両方の値に使用します。両方のパラメータに空文字列を指定した場合、レジストリはクラス名を使用します。第5パラメータは、クラス インスタンスの値が文字列として転送できるかを示します。また任意で第6パラメータ(ここには表示されていない)を追加して、同じオブジェクト インスタンスへの複数の参照が、SOAP パケットでどのように表示されるかを制御することも可能です。