Изменяющиеся массивы
В MIDL различные массивы фиксированы в размере. Они позволяют клиентам передавать различные части массивов от клиентов на серверы. Размер части массива может варьироваться в каждом вызове. Однако размер общего массива фиксирован.
Например, в следующем примере показано определение удаленной процедуры в интерфейсе в MIDL-файле. Размер массива, который клиент передает серверу, фиксируется константой ARRAY_SIZE. Интерфейс указывает часть массива, который клиент передает серверу в параметрах firstElement и chunkSize.
[
/*Attributes are defined here. */
]
interface MyInterface
{
const long ARRAY_SIZE = 1000;
MyRemoteProc(
[in] long lFirstElement,
[in] long lChunkSize,
[in, first_is(lFirstElement),
length_is(lChunkSize)] char achArray[ARRAY_SIZE]
);
/* Other interface procedures are defined here. */
}
Определение интерфейса использует атрибут MIDL [first_is] для указания номера индекса первого элемента в части массива, который клиент передает серверу. Атрибут [length_is] указывает общее количество элементов массива, которые передает клиент. Дополнительную информацию об этих атрибутах MIDL можно найти в разделе Атрибуты массива.
В следующем фрагменте кода показано, как клиент может вызвать удаленную процедуру, определенную в предыдущем MIDL-файле.
long lFirstArrayElementNumber = 20;
long lTotalElementsPassed = 100;
char achCharArray[ARRAY_SIZE];
// Code to store chars in the array goes here.
MyRemoteProc(
lFirstArrayElementNumber ,
lTotalElementsPassed ,
achCharArray);
firstArrayElementNumber = 120;
totalElementsPassed = 200;
MyRemoteProc(
lFirstArrayElementNumber ,
lTotalElementsPassed ,
achCharArray);
Этот фрагмент вызывает удаленную процедуру MyRemoteProc дважды. При первом вызове он передает элементы массива с номером 20–119, как указано значениями в переменных firstArrayElementNumber и totalElementsPassed. Во втором вызове клиент передает элементы массива с номером 120–319.