Атрибуты направления (параметр)
Атрибуты направления описывают, передаются ли данные с клиента на сервер, сервер на клиент или оба. Все параметры прототипа функции должны быть связаны с атрибутами направления. Три возможных сочетания атрибутов направления: 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изменяются второй и третий параметры. Первый параметр, являющийся только [в], не изменяется.
параметров