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

C# delphi从COM对象函数返回整数数组,c#,delphi,object,delphi-2010,pascal,C#,Delphi,Object,Delphi 2010,Pascal,一个typelibrary是从C创建的,并在Delphi5中使用它 类型库中有一个返回数组或字符串的方法。在Delphi中,我必须得到相同的字符串数组,但当我编译代码时,出现了以下错误 Incompatible types: 'tagSAFEARRAY' and 'Array' 这是C代码 public int[] sqrRootUpto(int num) { int[] result={0}; int tempVal=0; fo

一个typelibrary是从C创建的,并在Delphi5中使用它

类型库中有一个返回数组或字符串的方法。在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;

    }
编辑

TBL.pas具有此函数签名

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

TSafeArray和TSafeArray的区别是什么?ActiveX.pas中已经定义了TSafeArray记录。也许这对你有帮助。

试试声明

var
  result: TIntegerDynArray;
编辑:编辑之后,很明显,COM方法返回一个数组。使用整数数组的最简单方法是首先将其转换为变量数组:

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的赋值兼容:


我认为第一步是研究tadSAFEARRAY、TSafeArray等的定义,我认为它们存在于ActiveX.pas中。我相信这是为了与各种阵列一起使用。我还假设您的真实示例更复杂,因为这对于在Delphi中编写代码来说是微不足道的。我也使用了aavriant数组,但无法得到它。TSafeArray和TSafeArray的区别是什么?我想你指的是TSafeArray和Psafarray。PSafeArray是指向TSafeArray结构的指针。您尝试分配TSafeArray是没有用的,因为它是从C代码返回的。只需分配一个动态整数数组,并通过引用将其传递到C例程中,并以这种方式对其进行马歇尔处理,就会容易得多。既然你知道阵列需要有多大,这是完全可能的,几乎没有变化。为什么会有帮助?TINTEGERDYNARRY声明为Integer.RAYLE的数组,如果编译器因TagSafeARRY不兼容错误而拒绝,则函数应IMHO返回TSafeArray。
var
  result: TIntegerDynArray;
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;
result := IntSafeArrayToVarArray(newObj.sqrRootUpto(num));
for I := Low(result) to High(Result) do ...