サーバー インターフェイスの呼び出し
クライアント アプリケーションの作成 への移動
目次
アプリケーションで IAppServer インターフェイスや IAppServerSOAP インターフェイスを直接呼び出す必要はありません。クライアント データセットのプロパティやメソッドを使用すると、自動的に適切な呼び出しが行われるからです。 ただし、IAppServer インターフェイスや IAppServerSOAP インターフェイスを直接使用する必要はなくても、リモート データ モジュールのインターフェイスに独自の拡張を行っている可能性はあります。 アプリケーション サーバーのインターフェイスを拡張している場合には、接続コンポーネントによって作成された接続を使って何らかの方法でその拡張を呼び出す必要があります。 SOAP を使用している場合を除いて、これは、接続コンポーネントの AppServer プロパティを使って行うことができます。 AppServer は、アプリケーション サーバーのインターフェイスを表す Variant です。
このインターフェイスを呼び出すには、この Variant からディスパッチ インターフェイスを取得する必要があります。このディスパッチ インターフェイスの名前は、リモート データ モジュールを作成したときに作成されたインターフェイスの名前の後に、"Disp" という文字列を付加したものです。
つまり、リモート データ モジュールの名前が MyAppServer であれば、AppServer を使って次のように C++ でインターフェイスを呼び出すことができます:
IDispatch* disp = (IDispatch*)(MyConnection->AppServer)
IMyAppServerDisp tempInterface( (IMyAppServer*)disp);
TempInterface.SpecialMethod(x,y);
メモ: このディスパッチ インターフェイスは、タイプ ライブラリ エディタによって生成される _TLB.h ファイル内で宣言されています。
SOAP を使用しているのでなければ、Delphi で次のような文を記述すると、AppServer を使用してインターフェイス メソッドを呼び出すことができます。
MyConnection.AppServer.SpecialMethod(x,y);
ただし、この方法では、インターフェイス呼び出しが遅延(動的)バインディングされてしまいます。つまり、SpecialMethod 手続きの呼び出しは、実行時に呼び出しが実行されるまでバインドされません。遅延バインディングを使用すると、柔軟性は非常に高くなりますが、支援機能や型チェックなどの多くの利点が失われます。さらに、遅延バインディングでは、呼び出す前にインターフェイス呼び出しをセットアップするための、サーバーに対する余分な呼び出しがコンパイラによって生成されるため、事前バインディングよりも速度が遅くなります。
DCOM での事前バインディングの使用
通信プロトコルとして Delphi で DCOM を使用している場合には、AppServer 呼び出しの事前バインディングを使用できます。 as
演算子を使って、データ モジュールの作成時に作成した IAppServer の下位クラスに AppServer 変数をキャストします。 例:
with MyConnection.AppServer as IMyAppServer do
SpecialMethod(x,y);
DCOM で事前バインディングを使用するには、サーバーのタイプ ライブラリをクライアント マシンに登録しておかなければなりません。 RAD Studio に同梱されている TRegSvr.exe を使用して、タイプ ライブラリを登録することができます。
メモ: TRegSvr のサンプルでは、TRegSvr.exe のソースが提供されていて、さらにプログラムでタイプ ライブラリを登録する方法が示されています。TRegSvr のサンプルは、[スタート|プログラム|Embarcadero RAD Studio Sydney|サンプル] をクリックした後、
Object Pascal\VCL\TRegSvr
ディレクトリを開くと見つかります。
TCP/IP または HTTP でのディスパッチ インターフェイスの使用
TCP/IP または HTTP を使用している場合には、本当の事前バインディングを使用することはできませんが、リモート データ モジュールでデュアル インターフェイスが使われているため、アプリケーション サーバーのディスパッチ インターフェイスを使って単純な遅延バインディングよりもパフォーマンスを向上することができます。 ディスパッチ インターフェイスの名前は、リモート データ モジュールのインターフェイス名の後に 'Disp' という文字列を付加したものです。 AppServer プロパティをこの型の変数に代入して、ディスパッチ インターフェイスを取得することができます。 Delphi では次のようなコードになります。
var
TempInterface: IMyAppServerDisp;
begin
TempInterface :=IMyAppServerDisp(IDispatch(MyConnection.AppServer));
// …
TempInterface.SpecialMethod(x,y);
// …
end;
メモ: ディスパッチ インターフェイスを使用するには、タイプ ライブラリを保存したときに生成される _TLB ユニットを、クライアント モジュールの uses 句に追加する必要があります。
SOAP ベースのサーバーのインターフェイスの呼び出し
SOAP を使用している場合には AppServer プロパティを使用できません。そうではなく、リモート インターフェイス オブジェクト(THTTPRio)を使って、事前バインディングされた呼び出しを行わなければなりません。事前バインディングされた呼び出しでは、アプリケーション サーバーのインターフェイス宣言をクライアント アプリケーションがコンパイル時に知っている必要があります。
呼び出すインターフェイスについて記述された WSDL ドキュメントを参照することで、この情報をクライアント アプリケーションに追加することができます。 SOAP サーバーでは、このインターフェイスは SOAP データ モジュールのインターフェイスと完全に別であることに注意してください。 インターフェイスについて記述した WSDL ドキュメントをインポートする方法については、「WSDL ドキュメントのインポート」を参照してください。
サーバー インターフェイスを宣言しているユニットでは、インターフェイスを起動レジストリに登録する必要もあります。 呼び出し可能なインターフェイスを登録する方法の詳細は、「起動可能インターフェイスについて」を参照してください。 WSDL ドキュメントを C++ でインポートした後で、インターフェイスを宣言および登録するユニットを生成するには、そのインターフェイス用に THTTPRio のインスタンスを作成します。
THTTPRio *X = new THTTPRio(NULL);
次に、接続コンポーネントが使用するリモート インターフェイス オブジェクトの URL の後に呼び出したいインターフェイスの名前を続けたものを代入します。
X->URL = SoapConnection1.URL + "IMyInterface";
これで、QueryInterface メソッドを使って、サーバーのメソッドを呼び出すためのインターフェイスを取得できます。
InterfaceVariable = X->QueryInterface(IMyInterfaceIntf);
if (InterfaceVariable)
{
InterfaceVariable->SpecialMethod(a,b);
}
QueryInterface を呼び出すには、引数として、呼び出し可能なインターフェイス自体ではなく、そのインターフェイスの DelphiInterface ラッパーを渡す必要があることに注意してください。
SOAP を使用している場合には AppServer プロパティを使用できません。代わりに、GetSOAPServer メソッドを呼び出して、サーバーのインターフェイスを取得する必要があります。ただし、GetSOAPServer を呼び出す前に、以下の手順を実施しなければなりません。
- クライアント アプリケーションで、アプリケーション サーバーのインターフェイスの定義をインクルードし、起動レジストリに登録する必要があります。 呼び出すインターフェイスについて記述された WSDL ドキュメントを参照することで、このインターフェイスの定義をクライアント アプリケーションに追加することができます。 サーバー インターフェイスについて記述した WSDL ドキュメントをインポートする方法については、「起動可能インターフェイスについて」を参照してください。
- TSOAPConnection コンポーネントで、呼び出し可能なインターフェイスを呼び出す必要があります。
- SOAP 接続コンポーネントの SOAPServerIID プロパティに、サーバー インターフェイスの GUID を設定する必要があります。このプロパティは、アプリケーションがサーバーに接続する前に設定しておく必要があります。サーバーからどのインターフェイスを取得するかをこのプロパティによって TSOAPConnection コンポーネントに知らせるためです。
この 3 つの条件が満たされていると、Delphi で次のようにしてサーバー インターフェイスを取得することができます。
with MyConnection.GetSOAPServer as IMyAppServer do
SpecialMethod(x,y);