Поделиться через


Атрибуты directional (Parameter)

Атрибуты направления описывают, передаются ли данные от клиента к серверу, от сервера к клиенту или от обоих. Все параметры в прототипе функции должны быть связаны с атрибутами направления. Три возможных сочетания атрибутов направления: 1) [in], 2) [out] и 3) [in, out]. Они описывают способ прохождения параметров между вызывающими и вызываемой процедурами. При компиляции в стандартном режиме (расширенный режим Майкрософт) и пропуске атрибута направления для параметра компилятор MIDL принимает значение по умолчанию [in].

Параметр [out] должен быть указателем. На самом деле атрибут [out] не имеет смысла при применении к параметрам, которые не действуют как указатели, так как параметры функции C передаются по значению. В C вызываемая функция получает закрытую копию значения параметра; он не может изменить значение вызывающей функции для этого параметра. Однако если параметр выступает в качестве указателя, его можно использовать для доступа к памяти и изменения его. Атрибут [out] указывает, что серверная функция должна возвращать значение вызывающей функции клиента и что память, связанная с указателем, должна быть возвращена в соответствии с атрибутами, назначенными указателю.

В следующем интерфейсе показаны три возможных сочетания атрибутов направления, которые можно применить к параметру. Функция InOutProc определяется в IDL-файле следующим образом:

void InOutProc ([in]       short     s1,
                [in, out]  short *  ps2,
                [out]      float *  pf3);

Первый параметр, s1, имеет только значение [in]. Его значение передается на удаленный компьютер, но не возвращается вызывающей процедуре. Хотя серверное приложение может изменить значение s1, значение s1 на клиенте будет одинаковым до и после вызова.

Второй параметр, ps2, определен в прототипе функции как указатель с атрибутами [in] и [out]. Атрибут [in] указывает, что значение параметра передается от клиента на сервер. Атрибут [out] указывает, что значение, на которое указывает ps2 , возвращается клиенту.

Третий параметр — только [out]. Для параметра на сервере выделяется пространство, но значение не определено в записи. Как упоминалось выше, все параметры [out] должны быть указателями.

Удаленная процедура изменяет значение всех трех параметров, но клиенту доступны только новые значения параметров [out] и [in].

#define MAX 257

void InOutProc(short    s1,
               short * ps2,
               float * pf3)
{
    *pf3 = (float) s1 / (float) *ps2;
    *ps2 = (short) MAX - s1;
    s1++;  // in only; not changed on the client side
    return;
}

При возвращении из вызова InOutProc второй и третий параметры изменяются. Первый параметр, который имеет значение только [in], не изменяется.

в параметрах

параметры out

Параметры выхода