【问题标题】:delphi return array of integer from a COM object functiondelphi 从 COM 对象函数返回整数数组
【发布时间】:2011-01-11 10:58:29
【问题描述】:

一个类型库是从 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 的区别

【问题讨论】:

  • 我认为第一步是研究我认为存在于 ActiveX.pas 中的 tadSAFEARRAY、TSafeArray 等的定义。我相信这些是要与 Variant 数组一起使用的。我还认为您的真实示例更复杂,因为这对于 Delphi 中的代码来说是微不足道的。
  • 我也使用了 aavriant 数组,但无法获取。
  • 什么是 diff b/w TSafeArray 和 TSafeArray ?我认为您的意思是 TSafeArray 和 PSafeArray。 PSafeArray 是指向 TSafeArray 结构的指针。
  • 尝试分配 TSafeArray 是没有用的,因为它是从 C# 代码返回的。分配一个动态整数数组并通过引用将其传递到 C# 例程并以这种方式编组会容易得多。由于您知道数组需要多大,因此只需稍加改动即可实现。

标签: c# delphi object delphi-2010 pascal


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试声明

    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 ...
    

    【讨论】:

    • 为什么会有帮助? TIntegerDynArray 被声明为整数数组。
    • 废话,恕我直言,如果编译器因 tagSAFEARRAY 不兼容错误而拒绝该函数,则该函数应返回 TSafeArray。
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2013-05-12
    • 2020-07-20
    • 2017-08-02
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多