call_as 特性
[call_as] 属性使你能够将无法远程调用的函数映射到远程函数。
[call_as (local-proc), [ , operation-attribute-list ] ] operation-name ;
-
local-proc
-
指定操作定义的例程。
-
operation-attribute-list
-
指定应用于操作的一个或多个属性。 用逗号分隔多个属性。
-
operation-name
-
指定呈现给应用程序的命名操作。
将无法远程调用的函数映射到远程函数的功能在具有许多无法通过网络传输的参数类型的接口中特别有用。 可以使用 [call_as] 例程合并所有转换,而不是使用许多 [represent_as] 和 [transmit_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.
}
然后, (客户端和服务器端) 的两个 [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> );