2011-01-11 9 views
1

A Typelibrary ist aus C# erstellt und verwendet, die in Delphi 5.delphi return Array von Ganzzahl von einem COM-Objekt-Funktion

es ein Verfahren, in Typ-Bibliothek ist, die ein Array oder String zurückkehrt. In Delphi muss das gleiche Array von Strings abgerufen werden, aber wenn ich den Code kompiliert habe, kommt folgender Fehler.

Incompatible types: 'tagSAFEARRAY' and 'Array' 

Hier ist C# -Code

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; 

    } 

Hier ist Delphi-Code, wo ich die oben Funktion nenne.

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. 

EDIT

var 
result : variant; 

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

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

TBL.pas für die Funktion diese Signatur mit

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

was diff s/w TSafeArray und TSafeArray

+0

Ich denke, der erste Schritt wäre, in die Definition von tadSAFEARRAY, TSafeArray usw. zu schauen, die ich in ActiveX.pas existiere. Diese sollen mit Variant-Arrays, glaube ich, verwendet werden. Ich nehme auch an, dass Ihr reales Beispiel komplexer ist, weil das in Delphi einfach zu programmieren wäre. –

+0

Ich habe auch ein Aviant-Array verwendet, aber nicht in der Lage, das zu bekommen. – PawanS

+0

was ist diff b/w TSafeArray und TSafeArray? Ich glaube du hast TSafeArray und PSafeArray gemerkt. PSafeArray ist ein Zeiger auf die TSafeArray-Struktur. –

Antwort

0

Es ist bereits TSafeArray Datensatz in ActiveX.pas definiert. Vielleicht kann dir das helfen.

0

Versuch erklärt

var 
    result: TIntegerDynArray; 

Edit: Nach dem bearbeiten, ist es klar, dass Ihr COM-Methode eine PSafeArray zurückgibt. Ein einfachste Weg, einen Array von Integer zu verwenden, um es zunächst zu einer Variante Array zu konvertieren wäre:

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; 

Anschließend können Sie diese Funktion verwenden, da Variante Array von ganzen Zahlen ist zuweisungskompatibel mit TIntegerDynArray:

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

Warum sollte das helfen? TIntegerDynArray wird als Array von Integer deklariert. –

+0

Unsinn, sollte die Funktion IMHO TSafeArray zurückgeben, wenn der Compiler mit TagSAFEARRAY Inkompatibilitätsfehler zurückgewiesen. –

Verwandte Themen