length_is - атрибут
Атрибут [length_is] указывает количество передаваемых элементов массива. Необходимо указать не отрицательное значение.
[length_is( limited-expression-list )]
-
limited-expression-list
-
Задает одно или несколько выражений языка C. Каждое выражение вычисляется как целое число, представляющее количество передаваемых элементов массива. Компилятор MIDL поддерживает условные выражения, логические выражения, реляционные выражения и арифметические выражения. MIDL не допускает вызовы функций в выражениях и не допускает операторы приращения и декремента. Разделяйте несколько выражений запятыми.
Атрибут [length_is] определяет значение индексов массива, соответствующих атрибуту [last_is] , если не указан параметр [last_is] . Связь между этими индексами массива выглядит следующим образом: length = last - first + 1.
Атрибут [length_is] нельзя использовать одновременно с атрибутом [last_is] или атрибутом [string] .
Чтобы определить подсчитываемую строку с атрибутом [length_is] или [last_is] , используйте массив символов или указатель без атрибута [string] .
Использование константного выражения с атрибутом [length_is] является недопустимым использованием атрибута. Это является законным, но неэффективным и приведет к замедлению маршалинга кода.
Атрибуты [size_is] и [length_is] можно использовать вместе. При этом атрибут [size_is] управляет объемом памяти, выделенной для данных. Атрибут [length_is] указывает, сколько элементов передается. Объем памяти, указанный атрибутами [size_is] и [length_is] , не должен совпадать. Например, клиент может передать параметр [in, out] на сервер и указать выделение большого объема памяти с помощью [size_is], даже если он указывает небольшое количество элементов данных, передаваемых с помощью [length_is]. Это позволяет серверу заполнять массив большими данными, чем он получил, которые затем он может отправить обратно клиенту.
Как правило, не рекомендуется указывать параметры [size_is] и [length_is] в параметрах [in] или [out] . В обоих случаях [size_is] управляет выделением памяти. Приложение может использовать [size_is] для выделения большего количества элементов массива, чем передается (как указано в [length_is]). Однако это было бы неэффективно. Кроме того, было бы неэффективно указывать одинаковые значения для [size_is] и [length_is]. Так как это приведет к дополнительным издержкам при маршалинге параметров. Если значения [size_is] и [length_is] всегда одинаковы, опустите атрибут [length_is] .
/* counted string holding at most "size" characters */
typedef struct
{
unsigned short size;
unsigned short length;
[size_is(size), length_is(length)] char string[*];
} COUNTED_STRING_TYPE;
/* counted string holding at most 80 characters */
typedef struct
{
unsigned short length;
[length_is(length)] char string[80];
} STATIC_COUNTED_STRING_TYPE;
HRESULT Proc1(
[in] short iLength;
[in, length_is(iLength)] short asNumbers[10]);