从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
答案 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 ...