delphi从COM对象函数返回整数数组

时间:2011-01-11 10:58:30

标签: c# delphi object delphi-2010 pascal

从C#创建一个类型库,并在Delphi 5中使用它。

类型库中有一个返回数组或字符串的方法。在Delphi中,我必须获得相同的字符串数组,但是当我编译代码时,错误就会出现。

Incompatible types: 'tagSAFEARRAY' and 'Array'

这是C#代码

    public int[] sqrRootUpto(int num)
    {
        int[] result={0};
        int tempVal=0;
        for (int i = 2; num < tempVal; i++)
        {
            tempVal = i * i;
            result[i] = tempVal;                
      }
        return result;

    }

这是Delphi代码我在上面调用那些函数。

    procedure TForm1.BtnSqrtClick(Sender: TObject);
var
  num :Integer;
  result : array of Integer;
begin
      num := StrToInt(EditSqrtInput.text);
      result := newObj.sqrRootUpto(num);   //Here I am calling the above method
end; 
end.

修改

var
result : variant;

begin
 result := VarArrayCreate([0, 20], varInteger);

Error!! Incompatible types: 'tagSAFEARRAY' and 'Array'

TBL.pas具有此功能的签名

function  TMathClass.sqrRootUpto(rNum: Integer): PSafeArray;
begin
  Result := DefaultInterface.sqrRootUpto(rNum);
end;

什么是差异b / w TSafeArray和TSafeArray

2 个答案:

答案 0 :(得分:0)

ActiveX.pas中已经定义了TSafeArray记录。也许这可以帮到你。

答案 1 :(得分:0)

尝试声明

var
  result: TIntegerDynArray;

编辑:编辑完成后,很明显您的COM方法返回PSafeArray。使用Integer数组的最简单方法是首先将其转换为变量数组:

function IntSafeArrayToVarArray(const P: PSafeArray): OleVariant;
begin
  if Assigned(P) then
  begin
    VarClear(Result);
    tagVariant(Result).vt := varInteger or varArray;
    tagVariant(Result).PArray := P;
  end
  else
    Result := Null;
end;

然后您可以使用此函数,因为整数变量数组与TIntegerDynArray分配兼容:

result := IntSafeArrayToVarArray(newObj.sqrRootUpto(num));
for I := Low(result) to High(Result) do ...