2011-08-18 48 views
0

当一个程序需要使用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文件中声明并具有静态存储持续时间。

如何将参数(fileIdfilePipe)传递到NdrClientCall2()?我没有看到他们被传递。他们如何碰巧从包装到NdrClientCall2()

回答

1

嗯,不太清楚,但在MSDN doc字里行间(其说,最后一个参数是指向客户端调用堆栈)听起来像NdrClientCall2功能可以采取STUB_DESC结构,搞清楚参数类型和大小是什么,从堆栈中提取它们,完成调用远程接口的工作,然后将结果写回栈中的正确位置(对于OUT参数)。

1

不用太深入,在我看来,通过传递栈上第一个参数的地址(& IDL_handle),NdrClientCall2的实现可以看到堆栈上的后续参数。 NdrClientCall2的第二个参数表示可变参数的数量和大小。

相关问题