OLE Automation server newbie

I've a few questions with regard to an OLE automation server I'm writing at the
moment:

1. I use an OleVariant in my type library since this
is the only 'valid type' according to help files
that can contain an array and appear in a type library.

2. Is an OleVariant assignment-compatible both ways with a variant?

3. Is a WideString assignment-compatible both ways with a string?

4. Is what I'm attempting to do below possible?

5. Is there a better way of doing it?
I suspect that a string list could be converted to IStrings and returned
from a function as another interface, but I wouldn't know how to do this.

Client calls server:

MyVariant := MyCoClass.GetDocNames(WideString(Path));//path defined as string

Server method defined as:

MyCoClass.GetDocNames(Location: WideString): OleVariant;

Server in turn calls:

QueryDatabase(Location)

where QueryDatabase is defined as:

function QueryDatabase(const Location: string):variant;

This function attempts to construct an array of strings, whose final
destination
is the client:

function TDataModule.QueryDatabase(const Location: string):variant;
var
  arrFileNames: variant;
  i: integer;
  S: string;
begin
  Result := varNull;
  with Table do
  begin
    Active := true;
    if RecordCount <> 0 then
    begin
      CreateTempDir(Location);
      arrFileNames := VarArrayCreate([1,RecordCount],varVariant);
      i := 1;
      while not Eof do
      begin
        S := FieldByName('FileName').asString;
        arrFileNames[i] := S;
        TableFile.SaveToFile(Location + '\' + S);
        Inc(i);
        Next;
      end;{while}
      Active := false;
      Result := arrFileNames;
      end;{if}
  end;
end;

CHARLES JOHNSON