问题
I'm trying to read and write to the IIS 6 metabase using Inno Setup.
I can't figure out how to access arrays though.
IIS := CreateOleObject('IISNamespace');
Compr := IIS.GetObject('IIsCompressionScheme', 'localhost/W3SVC/Filters/Compression/deflate');
Arr := Compr.HcScriptFileExtensions;
{ ... [code to iterate and add items] here ... }
Compr.SetInfo();
The metabase editor calls the object type I'm trying to access a "multi-string".
VarType(Arr)
yields 0x200C as type (see http://www.jrsoftware.org/ishelp/topic_isxfunc_vartype.htm)
How can I work with such types of variables? Delphi supports something like
for I := VarArrayLowBound(Arr, 1) to VarArrayHighBound(Arr, 1) do
but Inno Setup doesn't. Or do I have to access the array completely via some OLE/COM-functions?
回答1:
You can cast the Variant
to array of string
, read and write the array and then cast back:
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;
Works in Unicode version of Inno Setup only. Probably because the Unicode Inno Setup is compiled with Delphi 2009 instead of Delphi 2 and 3, which likely has better Variant support. See also Upgrading from Ansi to Unicode version of Inno Setup (any disadvantages).
回答2:
Inno does not provide full Delphi support, as far as I remember the scripting language is based on Free Pascal.
Try the following:
for I := 0 to GetArrayLength(myArray) - 1 do
begin
//stuff
end;
来源:https://stackoverflow.com/questions/34317882/inno-setup-iterate-through-array-of-type-variant-from-oleobject