call_as 属性
[call_as] 属性を使用すると、リモートで呼び出すことができない関数をリモート関数にマップできます。
[call_as (local-proc), [ , operation-attribute-list ] ] operation-name ;
-
local-proc
-
操作定義ルーチンを指定します。
-
operation-attribute-list
-
操作に適用される 1 つ以上の属性を指定します。 複数の属性をコンマで区切ります。
-
operation-name
-
アプリケーションに表示される名前付き操作を指定します。
リモートで呼び出すことができない関数をリモート関数にマップする機能は、ネットワーク経由で送信できない多数のパラメーター型を持つインターフェイスで特に役立ちます。 多くの [represent_as] 型と [transmit_as] 型を使用するのではなく、[ call_as] ルーチンを使用してすべての変換を組み合わせることができます。 アプリケーション呼び出しとリモート呼び出しの間でルーチンをバインドするには、2 つの [call_as] ルーチン (クライアント側とサーバー側) を指定します。
[call_as] 属性は、オブジェクト インターフェイスに使用できます。 この場合、[call_as] ではリモート インターフェイスに透過的にマップできるインターフェイスがリモート インターフェイスに透過的にマップされるため、[ call_as] インターフェイス定義をローカル呼び出しだけでなく、リモート呼び出しにも使用できます。 [call_as] 属性は/osf モードでは使用できません。
たとえば、オブジェクト インターフェイス IFace のルーチン f1 では、ユーザー呼び出しと実際に送信される呼び出しとの間で多数の変換が必要であるとします。 次の例では、インターフェイス IFace の IDL ファイルと ACF ファイルについて説明します。
インターフェイス IFace の IDL ファイルで、次の手順を実行します。
[local] HRESULT f1 ( <users parameter list> )
[call_as( f1 )] long Remf1( <remote parameter list> );
インターフェイス IFace の ACF では、次の手順を実行します。
[call_as( f1 )] Remf1();
これにより、生成されたヘッダー ファイルは f1 の定義を使用してインターフェイスを定義しますが、 Remf1 のスタブも提供します。
MIDL コンパイラは、インターフェイス IFace のヘッダー ファイルに次の Vtable を生成します。
struct IFace_vtable
{
HRESULT ( * f1) ( <users parameter list> );
/* Other vtable functions. */
};
その後、クライアント側プロキシには Remf1 用の一般的な MIDL 生成プロキシが含まれますが、 Remf1 のサーバー側スタブは一般的な MIDL で生成されたスタブと同じになります。
HRESULT IFace_Remf1_Stub ( <parameter list> )
{
// Other function code.
/* instead of IFace_f1 */
invoke IFace_f1_Stub ( <remote parameter list> );
// Other function code.
}
次に、2 つの [call_as] ボンド ルーチン (クライアント側とサーバー側) を手動でコーディングする必要があります。
HRESULT f1_Proxy ( <users parameter list> )
{
// Other function code.
Remf1_Proxy ( <remote parameter list> );
// Other function code.
}
long IFace_f1_Stub ( <remote parameter list> )
{
// Other function code.
IFace_f1 ( <users parameter list> );
// Other function code.
}
オブジェクト インターフェイスの場合、これらはボンド ルーチンのプロトタイプです。
クライアント側の場合:
<local_return_type> <interface>_<local_routine>_proxy(
<local_parameter_list> );
サーバー側の場合:
<remote_return_type> <interface>_<local_routine>_stub(
<remote_parameter_list> );
非オブジェクト インターフェイスの場合、これらはボンド ルーチンのプロトタイプです。
クライアント側の場合:
<local_return_type> <local_routine> ( <local_parameter_list> );
サーバー側の場合:
<local_return_type> <interface>_v<maj>_<min>_<local_routine> (
<remote_parameter_list> );