![]() |
COM Object : Binär bzw. Struktur übergeben
Moin !
Hat zufällig jemand ein einfaches Beispiel zur Hand wie man einem COM Objekt Daten mittels eines SafeArrays übergibt und zwar einmal eine Struktur und einmal ein Binärklumpen. Ich konnte dazu noch kein einfaches Beispiel finden und meine Versuche sind bis jetzt auch eher fehlgeschlagen. Wäre nett wenn da jemand ein kleines Beispiel oder ein paar praktische Hinweise zu posten könnte. Im Moment fehlt mir einfach die Idee für die praktische Umsetzung. :gruebel: Danke schon mal ! |
Re: COM Object : Binär bzw. Struktur übergeben
Wie du die übergibst hängt ganz von der Dokumentation des jeweiligen Objektes zusammen. Das kann man nicht allgemein formulieren.
Aber vielleicht ist folgendes gemeint:
Delphi-Quellcode:
function SafeArray(const Structure; StructureSize:Integer):PSafeArray;
var Data:Pointer; PSA:PSafeArray; begin PSA:=SafeArrayCreateVector(VT_I1,0,StructureSize); //SafeArray erstellen (Elementgröße ist Byte =VT_I1 und Länge StructureSize) if not assigned(PSA) then raise Exception.create('SafeArrayCreateVector') else try if SafeArrayAccessData(PSA,Data)<>s_ok then //Zeiger auf den zusammenhängenden Speicherblock des Array bekommen raise Exception.create('SafeArrayAccessData') else try move(Structure,Data^,StructureSize); //Daten (Struktur) in Array kopieren finally if SafeArrayUnaccessData(psa)<>s_ok then raise Exception.create('SafeArrayUnAccessData'); //Zugriff auf Array wieder freigeben end; except SafeArrayDestroy(PSA); //bei Fehler Array löschen Raise; end; result:=PSA; end; Damit kann man bspw folgende zusammenhängende Daten speichern:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type TX=record i:Integer; s:string[5]; end; var x:TX; psa:PSafeArray; begin x.i:=5; x.s:='Hallo'; psa:=getSafeArray(x,sizeof(x)); //hier psa an Obejkt übergeben safearraydestroy(psa); //und je nach Dokumentation selber wieder freigeben end; |
Re: COM Object : Binär bzw. Struktur übergeben
Hier sind zwei Funktionen mit denen man einen AnsiString als "Variant-Array of varBytes"
verpacken und wieder auspacken kann. Dass man beliebige binäre Daten in einen AnsiString packen kann sollte ja bekannt sein.
Delphi-Quellcode:
function VarByteArrayCreate(const s:AnsiString):Variant;
var data : Pointer; begin if s<>'' then begin Result := VarArrayCreate([0, Length(s)-1], varByte); data := VarArrayLock(Result); try Move(s[1], data^, Length(s)); finally VarArrayUnlock(Result); end; end else Result := Null; end; function VarByteArrayToString(v:Variant):AnsiString; var len : Integer; data : Pointer; begin Assert(VarType(V) = varByte or varArray); Assert(VarArrayDimCount(V) = 1); len := VarArrayHighBound(v,1)-VarArrayLowBound(v,1)+1; SetLength(result, len); data := VarArrayLock(v); try Move(data^, Result[1], len); finally VarArrayUnlock(v); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz