Как работает этот вызов функции списка переменных параметров? - PullRequest
0 голосов
/ 18 августа 2011

Когда программе необходимо обмениваться данными с использованием 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()?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Не заглядывая слишком глубоко в это, мне кажется, что, передав адрес первого аргумента в стеке (& IDL_handle), реализация NdrClientCall2 может увидеть последующие аргументы, которые также находятся в стеке. Второй аргумент NdrClientCall2 указывает количество и размер переменных.

1 голос
/ 18 августа 2011

Ну, не совсем уверен, но чтение между строк в MSDN doc (которое говорит, что последний аргумент - Указатель на стек вызовов на стороне клиента ), звучит какNdrClientCall2 функция может взять структуру STUB_DESC, выяснить, какие типы и размеры аргументов, извлечь их из стека, выполнить работу по вызову удаленного интерфейса и затем записать результаты обратно в соответствующие места в стеке (для OUTпараметры).

...