C# delphi从COM对象函数返回整数数组
一个typelibrary是从C创建的,并在Delphi5中使用它 类型库中有一个返回数组或字符串的方法。在Delphi中,我必须得到相同的字符串数组,但当我编译代码时,出现了以下错误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
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 ...