当一个程序需要使用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()
?