![]() |
OleVariant zu TBytes
Hallo!
Ich habe ein Problem mit dieser Funktion:
Delphi-Quellcode:
Ich möchte einen OleVariant zu TBytes wandeln. Wenn ich es debugge dann beim ersten Einstieg in diese Funktion die var MyVariantStream schon Assigned!?
procedure TMyThread.VariantToTBytes(Data: OleVariant; var Result:TBytes);
var p: Pointer; MyVariantStream :TMemoryStream; MyByte: TBytes; begin try if not assigned(MyVariantStream) then MyVariantStream := TMemoryStream.Create else begin MyVariantStream.Free; MyVariantStream := TMemoryStream.Create; end; except Result := nil; Exit; end; p := VarArrayLock(Data); try MyVariantStream.Write(p^, VarArrayHighBound(Data,1) + 1); finally VarArrayUnlock(Data); end; SetLength(MyByte,MyVariantStream.Size); MyVariantStream.Position := 0; MyVariantStream.Read(MyByte[0],MyVariantStream.Size); MyVariantStream.Free; Result := MyByte; end; Wenn er nun ein Free druchführt kommt es zur Zugriffsverletzung. Auch wenn ich den MemoryStream einfach erzeuge gibt es eine Zugriffsverletzung. Was kann hier der Fehler sein? Oder gibt es einen einfacheren Weg eine OleVariant in TBytes umzuwandeln? Die Länge der benötigten TBytes ist vorher unbekannt! |
AW: OleVariant zu TBytes
Schmeiß den ganz Block
Delphi-Quellcode:
raus
try
if not assigned(MyVariantStream) then MyVariantStream := TMemoryStream.Create else begin MyVariantStream.Free; MyVariantStream := TMemoryStream.Create; end; except Result := nil; Exit; end; statt dessen nur
Delphi-Quellcode:
MyVariantStream := TMemoryStream.Create
Stackvariablen sind nicht installiert |
AW: OleVariant zu TBytes
Ich nehme dazu immer das:
Delphi-Quellcode:
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; |
AW: OleVariant zu TBytes
Super Danke!
Habe es nun so gelöst:
Delphi-Quellcode:
procedure TMyThread.VariantToTBytes(Data: OleVariant; var Result:TBytes);
var p: Pointer; len : integer; begin p := VarArrayLock(Data); try len := VarArrayHighBound(Data, 1) + 1; SetLength(Result, len); if len > 0 then CopyMemory(@Result[0], p, len); finally VarArrayUnlock(Data); end; end; |
AW: OleVariant zu TBytes
Besser das VarArrayLowBound mit beachten, denn VariantArrays müssen nicht bei 0 beginnen.
Delphi-Quellcode:
len := (VarArrayHighBound(Data, 1) - VarArrayLowBound(Data, 1) + 1)
* VarArrayElementSize(Data) { div SizeOf(Result[0]) }; // SizeOf(Result[0]) aka SizeOf(Byte) ist hier eh 1 ![]() ![]() ![]() ![]() PS: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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