TFileStream an DLL übergeben
Hallo,
ich möchte einen Filestream an eine DLL übergeben. Die DLL hat dafür eine Funktion
Delphi-Quellcode:
und aufgerufen wird dies dann im Programm mit
procedure SetFileData(Data: Pointer; DataLen: int64); stdcall;
Delphi-Quellcode:
In der DLL dann soll das Ganze auf Plattefs := TFilestream.Create(Filename,fmOpenRead); SetFileData(@fs,fs.Size);
Delphi-Quellcode:
Leider ist meineTestDatei leer (0 Byte!)
procedure SetFileData(Data: Pointer; DataLen: int64); stdcall;
var Dateiname: string; fs: TFileStream; begin Dateiname := TPath.getsharedDocumentspath + TPath.DirectorySeparatorChar + 'meineTestdatei.txt'; fs := TFileStream.Create(Dateiname, fmCreate); fs.Write(Data^, DataLen); fs.free; Wo liegt der Fehler? Ciao Stefan |
AW: TFileStream an DLL übergeben
Du willst ja nicht die Stream-Instanz übergeben, sondern die Daten, die diese enthält. Ich würde einen TMemoryStream verwenden, der hat eine Memory-Eigenschaft, wo die Daten drinstehen.
|
AW: TFileStream an DLL übergeben
... und wie würde das aussehen?
Auch mit Übergabe eines array of byte bekomme ich Probleme! Ciao Stefan |
AW: TFileStream an DLL übergeben
Aus dem Hut würde ich sagen:
Delphi-Quellcode:
Bie der 0 bin ich gerade selbst nicht sicher.
var
Stream: TMemoryStream; begin Stream := TMemoryStream.Create; try Stream.LoadFromFile(...); Stream.Position := 0; SetFileData(Stream.Memory{[0]}, Stream.Size); finally Stream.Free; end; end; |
AW: TFileStream an DLL übergeben
Zitat:
Zitat:
Delphi-Quellcode:
SetFileData(PByte(DeineArrayVariable[0]), Length(DeineArrayVariable));
|
AW: TFileStream an DLL übergeben
Zitat:
Das Position kann man sich sparen, es wird ja nur der Anfang und die Länge übergeben, egal wo der Zeiger im Stream steht. Ciao Stefan |
AW: TFileStream an DLL übergeben
Die Macht der Gewohnheit ;)
|
AW: TFileStream an DLL übergeben
Und nur weil es so im Titel steht.
Man reicht NIEMALS nie keine Delphi-Objekte über Modulgrenzen (DLL oder EXE) hinweg. SharedMemory ginge eventuell noch, aber SharedRTTI/-TypeInfo gibt es eben nicht, außer bei Verwendung von Packages (BPL). |
AW: TFileStream an DLL übergeben
Ich übergebe doch kein Delphi-Objekt (TFilestream oder TMemorystream) an die Dll sondern einen Pointer auf die Daten darin und die Länge der Daten....
Übersehe ich da nun etwas? Oder hätte der Threadtitel nur besser "Inhalt eines TFilestream an Dll übergeben" heissen sollen? Ciao Stefan |
AW: TFileStream an DLL übergeben
Ist das eine Dll von Dir? Dann würde ich den Stream über das IStream-Inteface übergeben.
|
AW: TFileStream an DLL übergeben
Neee, aber in der Überschrifft und im ersten Post hattest du mehrmals geschrieben, dass du das machen wolltest. :zwinker:
Nicht das du oder jemand Anderes beim nächsten Mal nochmal auf soeine Idee kommt. |
AW: TFileStream an DLL übergeben
Zitat:
Delphi-Quellcode:
Lass dir fs.Size anzeigen und du wirst sehen, es ist die Größe des FileStream-Objektes.
fs := TFilestream.Create(Filename,fmOpenRead);
SetFileData(@fs,fs.Size); |
AW: TFileStream an DLL übergeben
Das möchte ich bezweifeln, dann hätte die Property ja keinerlei Sinn. Du meinst vermutlich SizeOf.
|
AW: TFileStream an DLL übergeben
Äh. Ja.
Trotzdem hat er im ersten Beitrag, das Objekt übergeben und nicht dessen Dateninhalt. |
AW: TFileStream an DLL übergeben
Und ich habe bereits im 2. Beitrag erwähnt, dass das falsch ist. Muss doch mal gut sein jetzt.
|
AW: TFileStream an DLL übergeben
Ich wollte ihm es nur noch mal deutlich machen, nachdem er vorhin gerade widersprochen hatte. ;) Aber jetzt ist alles gut.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz