Einzelnen Beitrag anzeigen

Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

AW: ActiveX SafeArray Sample-code

  Alt 11. Sep 2014, 10:31
Schwieriges Thema. Bin noch nicht erfahren genug dafür, aber wie wäre es mit folgender Idee:

Delphi-Quellcode:
type
  TMyStruct = record
    Val_1 : Integer;
    Val_2 : Extended;
  end;
Delphi-Quellcode:
  protected
    procedure Get_MyArray(var Data : OleVariant); safecall;
Delphi-Quellcode:
procedure TA0001.Get_MyArray(var Data: OleVariant);
var
  MStream : TMemoryStream;
  Address : Pointer;
  MyStruct : TMyStruct;
begin
  MStream := TMemoryStream.Create;
  try
    //Vorbereiten
    MyStruct.Val_1 := Random(100);
    MyStruct.Val_2 := Random();
    MStream.SetSize(SizeOf(TMyStruct));
    MStream.Position := 0;
    MStream.Write(MyStruct,SizeOf(TMyStruct));
    //VariantArray
    Data := VarArrayCreate([0,MStream.Size-1],varByte);
    Address := VarArrayLock(Data);
    MStream.Position := 0;
    MStream.Read(Address^,MStream.Size);
  finally
    VarArrayUnlock(Data);
    MStream.Free;
  end;
end;
Beim Aufruf muss man dann Data als ByteArray betrachten und das dann auf die Struktur von TMyStruct abbilden:
D.h. Val_1 steckt in den ersten 4 bytes und Val_2 in den übrigen (Achtung 32bit (10byte) unterscheidet sich von 64bit (8byte) ).
http://docwiki.embarcadero.com/RADSt...Einfache_Typen

Schreiben sollte auch in der Art (Die Arrays als EIN ByteArray an dein ActiveX Element übergeben) möglich sein. Deine Schnittstelle muss dann nur die Größe des ByteArrays auswerten ( durch die Größe eines Records teilen) und die Anzahl in ein RecordArray schreiben. Habe das selber benutzt um ein Bitmap mit 25 MByte prozessübergreifend zu übertragen (one way server to client). Das ging zumindest sehr flott.

Folgender Link könnte dir noch hilfreich sein:
http://delphi.about.com/library/weekly/aa122104a.htm

Schreib auch bitte ob das funzt. Bei mir kompiliert es zumindest schon mal

Grüße!
Chris
Chris

Geändert von Photoner (11. Sep 2014 um 10:33 Uhr) Grund: wo bleiben meine Manieren...
  Mit Zitat antworten Zitat