Атрибуты длины, размера и направления
При передаче массивов между клиентом и сервером связанные с размером атрибуты [max_is] и [size_is] определяют, сколько элементов массива выделяет заглушка сервера. Атрибуты, связанные с длиной [length_is], [first_is] и [last_is], определяют количество элементов, передаваемых на сервер и клиент.
К параметрам можно применять различные атрибуты направления. Однако некоторые сочетания атрибутов направления могут привести к ошибкам. В качестве примера предположим, что вы пишете интерфейс, указывающий процедуру с двумя параметрами, массивом и передаваемой длиной массива. Термин dir_attr относится к атрибуту directional, применяемого к параметру, следующим образом:
Proc1(
[dir_attr] short *plength;
[dir_attr, length_is(pLength)] short array[MAX_SIZE]);
Поведение компилятора MIDL для каждой комбинации атрибутов направления описано в следующей таблице.
Array | Параметр Length | Действия-заглушки во время вызова от клиента к серверу | Действия-заглушки при возврате с сервера на клиент |
---|---|---|---|
[in] | [in] | Передает длину и количество элементов, указанных параметром . | Данные не передаются. |
[in] | [out] | Не является законным; Ошибка компилятора MIDL. | Не является законным; Ошибка компилятора MIDL. |
[in] | [вход,выход] | Передай длину и количество элементов, указанных параметром length. | Передача только длины. |
[out] | [in] | Передай длину. Если размер массива является фиксированным, выделите размер массива на сервере, но не передайте элементы. Если размер массива не привязан, не является допустимым: ошибка компилятора MIDL. |
Передать количество элементов, указанных длиной. Обратите внимание, что длина может быть изменена и иметь значение, отличное от значения на клиенте. Не передавать длину. |
[out] | [out] | Выделите место для параметра length на сервере, но не передайте параметр . Если размер массива является фиксированным, выделите размер массива на сервере, но не передайте элементы. Если размер массива не является фиксированным, не является допустимым: ошибка компилятора MIDL. |
Передай длину и количество элементов, указанных длиной, заданной серверным приложением. |
[out] | [вход,выход] | Передай параметр length. Если размер массива привязан, выделите размер массива на сервере, но не передайте элементы. Если размер массива не привязан, не является допустимым: ошибка компилятора MIDL. |
Передай длину. Передай число элементов массива, указанных длиной. |
[вход,выход] | [in] | Передает длину и количество элементов, указанных параметром . | Не передавать длину. Передать количество элементов, указанных длиной. Обратите внимание, что длина может быть изменена и может иметь значение, отличное от исходного значения на клиенте. |
[вход,выход] | [out] | Не является законным; Ошибка компилятора MIDL. | Не является законным; Ошибка компилятора MIDL. |
[вход,выход] | [вход,выход] | Передает длину и количество элементов, указанных параметром . | Передает длину и количество элементов, указанных параметром . |
Как правило, не следует изменять параметры длины или размера на стороне сервера. Если изменить параметр length, память может быть потеряна. Дополнительные сведения см. в разделе Потерянные память.