Share via


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> );

另請參閱

/osf

represent_as

transmit_as