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


Атрибуты направления (параметр)

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

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

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

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

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

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

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

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

#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изменяются второй и третий параметры. Первый параметр, являющийся только [в], не изменяется.

в параметрах

параметров

встроенных параметров