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


Атрибуты длины, размера и направления

При передаче массивов между клиентом и сервером связанные с размером атрибуты [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, память может быть потеряна. Дополнительные сведения см. в разделе Потерянные память.