Когда программе необходимо обмениваться данными с использованием 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 , для которой объявлен ...
в качестве третьего параметра и выполняется фактическая работа.MyInterfaceRpc__MIDL_ProcFormatString
- это просто последовательность жестко закодированных байтов, сгенерированных MIDL, поэтому второй параметр - это начало подсекции в этом массиве, объявленной в том же файле .c, что и функция-обертка, и имеющей статическую продолжительность хранения.Как параметры (fileId
и filePipe
) передаются в NdrClientCall2()
?Я не вижу, как их пропускают.Как они попадают из оболочки в NdrClientCall2()
?