Sonntag, 12. Februar 2012

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Media

Webhosting mit Host Europe
Array of Record an den Aufrufer übergeben?

Frage: Ist es möglich, in einer DCOM-Anwendung ein Array von Records als out-Parameter an die aufrufende Anwendung zurückzugeben?

Antwort: Ja, das geht, wobei es sogar prinzipiell 3 unterschiedliche Techniken dafür gibt:

a) Ein im Arbeitsspeicher initialisiertes Recordset-Objekt (ADO) wird als In-Memory-Datenbanktabelle mit Daten gefüllt und an den Aufrufer übergeben. In diesem Fall kümmert sich MDAC auf beiden Seiten um die notwendigen Anpassungen.

b) Die eigenen Records werden als SafeArray verpackt und als OleVariant-Parameter an den Aufrufer übergeben. In diesem Fall kümmert sich der Typbibliotheks-Marshaler von Windows auf beiden Seiten um die notwendigen Anpassungen.

c) Die eigenen Records werden dem Typbibliotheks-Marshaler von Windows über eine eigene IRecordInfo-Implementierung bekannt gemacht.

Das folgende Beispiel demonstriert den zweiten Weg über das SafeArray. Die Daten aus dem Record werden im ersten Schritt über die Funktion VarArrayOf als SafeArray verpackt, während diese einzelnen Datenblöcke dann in ein gemeinsames SafeArray verpackt werden, das über die Funktion VarArrayCreate in der benötigten Größe angefordert wurde.

uses ActiveX;

procedure SafeArrayRecordCollection(var vData: Variant); const cCOUNT = 5; var i : Integer; v : Variant; begin vData := VarArrayCreate([0, cCOUNT - 1], varVariant); for i := 0 to cCOUNT - 1 do begin // Record aus einem String- und Integer-Wert simulieren v := Format('Recordeintrag%d', [i]); vData[i] := VarArrayOf([v, i * 10]); end; end;
procedure TForm1.Button1Click(Sender: TObject); var vData : Variant; pSA : PSafeArray; iLBound : Integer; iUBound : Integer; i : Integer; vString : Variant; begin SafeArrayRecordCollection(vData); pSA := PSafeArray(TVarData(vData).VArray); SafeArrayGetLBound(pSA, 1, iLBound); SafeArrayGetUBound(pSA, 1, iUBound); for i := iLBound to iUBound do begin SafeArrayGetElement(pSA, i, vString); ListBox1.Items.Add(vString[0]); ListBox1.Items.Add(vString[1]); end; end;






Software & Support Media GmbH