As indicated above It is likely sufficient to replace the open array parameter by TStringArray - defined in sysutils - instead of the open array of string.
In trunk there is also the copy command to copy an open array to a dynamic array:
https://wiki.freepascal.org/FPC_New_Features_Trunk#Copy_supports_Open_Array_parameters{$mode objfpc}{$H+}
uses sysutils;
function copyarray(const values:array of string):TStringArray;
begin
Result := copy(values,0,length(values));
end;
var
a:TStringArray;
s:string;
begin
a:= copyarray(['1','2','3'] );
for s in a do writeln(s);
end.
Of course you can also do the copy to a local variable of type TStringArray;
There is no need for setlength. This just illustrates the technique.
You use a var parameter for your open array: you can't change the length in that case, you
must use TstringArray in that case (or TStringDynArray from types, which is the same) as parameter.
You can change the value of the individual elements of an open array parameter, though.
What is also an option is to pass a TStringArray as an open array. This is automatic. E.g.:
{$mode delphi}{$H+}
uses sysutils;
procedure test(var values:array of string);
var s:string;
begin
if length(values) > 0 then values[0] := 'test';
for s in values do writeln(s);
end;
var
a:TStringArray = ['1','2','3'];
begin
test(a);
setlength(a,4);
a[3] :='test2';
test(a);
end.
This likely works in 3.2.X too, but not tested.