【发布时间】:2011-08-18 07:20:33
【问题描述】:
当程序需要使用 Microsoft RPC 进行通信时,开发人员通常会为所有方法编写 IDL 定义,例如:
error_status_t rpcMyInterfaceGetFile( [in] const GUID fileId, [out] BYTE_PIPE filePipe );
由 MIDL 编译器编译并产生一个包装函数:
/* [fault_status][comm_status] */ error_status_t rpcMyInterfacerGetFile(
/* [in] */ handle_t IDL_handle,
/* [in] */ const GUID fileId,
/* [out] */ BYTE_PIPE filePipe)
{
CLIENT_CALL_RETURN _RetVal;
_RetVal = NdrClientCall2(
( PMIDL_STUB_DESC )&IMyInterfaceRpc_StubDesc,
(PFORMAT_STRING) &MyInterfaceRpc__MIDL_ProcFormatString.Format[SomeNumberHere],
( unsigned char * )&IDL_handle);
return ( error_status_t )_RetVal.Simple;
}
这里调用被转发到NdrClientCall2() RPC runtime function,它被声明为将... 作为第三个参数并执行实际工作。 MyInterfaceRpc__MIDL_ProcFormatString 只是 MIDL 生成的硬编码字节序列,因此第二个参数是该数组中的一个小节的开头,该数组在与包装函数相同的 .c 文件中声明并具有静态存储持续时间。
参数(fileId 和filePipe)如何传递到NdrClientCall2()?我没有看到他们被通过。它们是如何从包装器中获取到NdrClientCall2() 的?
【问题讨论】:
标签: c++ c winapi visual-c++ rpc