Удаленный вызов процедур и MIDL: как реализовать функцию с атрибутом [out]?

Я пишу сервер и клиент, используя язык определения интерфейса и удаленный вызов процедур на С++. Я могу отправлять данные с клиента на сервер с атрибутом [in]. Теперь я хочу, чтобы сервер отправлял данные обратно клиенту. Но мне не удалось получить правильные данные.

Я определяю функцию в интерфейсе .idl, как показано ниже:

[
    //uuid and verison define here
]

interface utility{
    void sendData([in] int numIn, [out] int *numOut);
}

Документ MIDL Говорит, что

Параметр только для [out] считается неопределенным при вызове удаленной процедуры и выделении памяти для объекта сервером.

Итак, в client.cpp я создаю экземпляр переменной и вызываю функцию.

RpcTryExcept{
    int *num;
    sendData(hBinding, 123, num);
}

В server.cpp,

void sendData(handle_t IDL_handle, int numIn, int *numOut){
    numOut = new int[3];
    numOut[0] = 1;
    numOut[1] = 2;
    numOut[2] = 3;     
}

Я напечатал массив int в клиенте и получил 3 случайных числа. Я также попытался сначала определить размер в клиенте. int *num = new int[3]. На этот раз он может передать значение numOut[0] клиенту, но все остальные индексы перепутаны. Я также пробовал массив символов, но ничего хорошего. Может я что-то недопонимаю. Может ли кто-нибудь дать мне несколько идей? Спасибо.


person tianhuaf    schedule 31.08.2017    source источник


Ответы (1)


Код

void sendData(handle_t IDL_handle, int numIn, int *numOut){
    numOut = new int[3];
    numOut[0] = 1;
    numOut[1] = 2;
    numOut[2] = 3;     
}

только изменяет копию значения параметра указателя и оставляет вас с утечкой памяти.

Я подозреваю, что реализация должна выглядеть так

void sendData(handle_t IDL_handle, int numIn, int *numOut){
    *numOut = 42;
}

Чтобы вернуть массив с параметром [out], подпись будет выглядеть так:

void sendData(handle_t IDL_handle, int numIn, int **numOut);

Еще раз проверьте свои определения IDL.

person user0042    schedule 31.08.2017
comment
Спасибо, это работает. Теперь я немного запутался. Когда сервер отправляет массив int или массив float (я читаю файл в массив float) клиенту, он работает либо с float *, либо с float[] в IDL. Но когда клиент отправляет данные на сервер, он показывает другое поведение. Я постараюсь разобраться. - person tianhuaf; 31.08.2017