Inno Setup:遍历Variant类型的数组(来自OleObject)

时间:2015-12-16 17:02:26

标签: inno-setup ole variant pascalscript iis-metabase

我尝试使用Inno Setup读取和写入IIS 6元数据库 我无法弄清楚如何访问数组。

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

元数据库编辑器调用对象类型I尝试访问"多字符串"。

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 个答案:

答案 0 :(得分:1)

您可以将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支持。另请参阅Upgrading from Ansi to Unicode version of Inno Setup (any disadvantages)

答案 1 :(得分:-1)

Inno并不提供完整的Delphi支持,据我所知,脚本语言基于Free Pascal。

尝试以下方法:

 for I := 0 to  GetArrayLength(myArray) - 1 do
  begin
     //stuff
  end;