Как использовать вариантные массивы в Delphi

У меня есть две программы Delphi7: сервер автоматизации COM (EXE) и другая программа, использующая сервер автоматизации.

Мне нужно передать массив байтов из одной программы в другую.

После некоторого поиска я обнаружил, что использование вариантных массивов - это путь (поправьте меня, пожалуйста, если вы знаете какие-либо лучшие методы).

Мой вопрос: как мне создать массив вариантов в одной программе, а затем как мне прочитать его значения в другой?

Я знаю о VarArrayCreate и VarArrayLowBound/VarArrayHighBound, но не знаю, как это сделать правильно.

Спасибо!


person Steve    schedule 01.09.2010    source источник


Ответы (2)


Вы создаете его так:

Декларации сначала

var
  VarArray: Variant;
  Value: Variant;

Затем создание:

VarArray := VarArrayCreate([0, Length - 1], varVariant);

или у вас также может быть

VarArray := VarArrayCreate([0, Length - 1], varInteger);

Зависит от типа данных. Затем вы выполняете итерацию следующим образом:

i := VarArrayLowBound(VarArray, 1);
HighBound := VarArrayHighBound(VarArray, 1);

while i <= HighBound do
begin
  Value := VarArray[i];
  ... do something ...
  Inc(i);
end;

Наконец, вы очищаете массив, когда он вам больше не нужен. РЕДАКТИРОВАТЬ: (это необязательно, см. В Delphi 2009 выполните Мне нужно освободить массивы вариантов? )

VarClear(VarArray);

Вот и все. Другой пример можно найти в официальной справке Embracadero

РЕДАКТИРОВАТЬ:

Массив должен быть создан только один раз. Затем просто используйте его, как показано в приведенном выше примере.

person Runner    schedule 01.09.2010
comment
Спасибо! Не могли бы вы также привести пример кода, как прочитать массив обратно на стороне клиента? Скажем, vararray передается клиенту в варианте, как вы его читаете? Вы вызываете VarArrayCreate или просто используете VarArrayLowBound и т. д.? - person Steve; 01.09.2010
comment
Просто используйте массив на другой стороне. Создайте его только один раз. Но следите за тем, кто несет ответственность за его очистку. - person Runner; 01.09.2010
comment
Очищение и освобождение — не одно и то же - person Reversed Engineer; 16.05.2019
comment
Никогда не говорил, что это одно и то же. Я также предоставил URL-адрес, где объясняется природа подсчета ссылок. - person Runner; 16.05.2019

Для другой стороны:

(при условии, что значение является параметром Variant, а тип элемента — WideString)

var
  Source: PWideStringArray;

if VarIsArray(Value) then begin
  Source:= VarArrayLock(Value);
  try
    for i:= 0 to TVarData(Value).VArray^.Bounds[0].ElementCount - 1 do
      DoWhatEverYouWantWith(Source^[i]);
    end;
  finally
    VarArrayUnlock(Value);
  end;
end;  
person Uwe Raabe    schedule 01.09.2010
comment
Для чего нужен VarArrayLock? Я использую массив байтов, кстати. Где определяется PWideStringArray? Есть ли также PByteArray? Спасибо! - person Steve; 02.09.2010
comment
PWideStringArray — это самоопределяемый тип, как следует из названия, указатель на массив WideString. Вы можете найти PByteArray в SysUtils. VarArrayLock блокирует массив и возвращает указатель на память, содержащую массив, для более быстрого доступа. Поскольку у вас есть разные процессы, работающие с этим массивом, я предлагаю использовать эту функцию. Дополнительную информацию можно найти в справке D7. - person Uwe Raabe; 02.09.2010