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. */
};
用戶端 Proxy 接著會為 Remf1產生一般 MIDL 產生的 Proxy,而 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> );