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


Изменяющиеся массивы

В 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.