Inno Setup: перебирать массив типа Variant (из OleObject)

Я пытаюсь читать и писать в метабазу IIS 6 с помощью Inno Setup.
Я не могу понять, как получить доступ к массивам, хотя.

IIS := CreateOleObject('IISNamespace');
Compr := IIS.GetObject('IIsCompressionScheme', 'localhost/W3SVC/Filters/Compression/deflate');
Arr := Compr.HcScriptFileExtensions;
{ ... [code to iterate and add items] here ... }
Compr.SetInfo();

Редактор метабазы ​​вызывает объект типа, который я пытаюсь получить доступ к "многострочный".

VarType(Arr) выдает 0x200C как тип (см. http://www.jrsoftware.org/ishelp/topic_isxfunc_vartype.htm)

Как я могу работать с такими типами переменных? Delphi поддерживает что-то вроде

for I := VarArrayLowBound(Arr, 1) to VarArrayHighBound(Arr, 1) do

но Inno Setup нет. Или я должен получить доступ к массиву полностью через некоторые OLE/COM-функции?

2 ответа

Решение

Вы можете разыграть Variant в array of stringпрочитайте и запишите массив, а затем приведите обратно:

var
  VariantArray: Variant;
  Count: Integer;
  ArrayOfStrings: array of string;
  I: Integer;
begin
  { ... }
  VariantArray := Compr.HcScriptFileExtensions;

  { Cast to array }
  ArrayOfStrings := VariantArray;

  { Read the array }
  Count := GetArrayLength(ArrayOfStrings);
  Log(Format('Count = %d', [Count]));

  for I := 0 to Count - 1 do
  begin
    Log(Format('%d: %s', [I, ArrayOfStrings[I]]));
  end;

  { Modify the array (append element) }
  SetArrayLength(ArrayOfStrings, Count + 1);
  ArrayOfStrings[Count] := 'new string';

  { Cast back to the variant }
  VariantArray := ArrayOfStrings;
  ...
end;

Работает только в версии Inno Setup для Unicode. Вероятно, потому что Unicode Inno Setup скомпилирован с Delphi 2009 вместо Delphi 2 и 3, которые, вероятно, имеют лучшую поддержку Variant. См. Также Обновление от Ansi до Unicode-версии Inno Setup (любые недостатки).

Inno не предоставляет полной поддержки Delphi, насколько я помню, язык сценариев основан на Free Pascal.

Попробуйте следующее:

 for I := 0 to  GetArrayLength(myArray) - 1 do
  begin
     //stuff
  end;   
Другие вопросы по тегам