Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MemoryStream auf Speicherinhalt? (https://www.delphipraxis.net/92604-memorystream-auf-speicherinhalt.html)

creality 23. Mai 2007 07:21


MemoryStream auf Speicherinhalt?
 
Hallo Forum,

kurzes Problem: Es liegen mehrere Bilder in einem definierten Speicherbereich dessen Einsprungsadresse ich kenne. Wie kann man nun einen MemoryStream von einem Speicherblock erzeugen und diesen bsp. via TCP verschicken?

Momentan habe ich eine Quick&Dirty Lösung die funktioniert: Ich kopiere das Bild in die Zwischenablage und versende den Stream übers Netz.

Delphi-Quellcode:
 
LoaderBMP.LoadFromClipboardFormat(CF_BITMAP, Clipboard.GetAsHandle(CF_BITMAP), 0);
// Save Image to Stream
LoaderBMP.SaveToStream(MemStr);
Ich würde aber jetzt gern das LoaderBMP aus dem Speicher direkt erzeugen. Im Speicher liegen aber keine Bilddatan der herkömmlichen Art, sondern RAW Images. Aber das macht ja nichts, denn auf der Client Empfangsseite "weiss" ich ja was ankommt.

Kann mir jemand Helfen?

Problem in Delphi Worten:
MemoryStream.Create(Anfangsadresse.Im.Speicher, Endadresse.Im.Speicher);
TCPSend(MemoryStream);
Öhm?

chaosben 23. Mai 2007 07:30

Re: MemoryStream auf Speicherinhalt?
 
Hi!

Du könntest dir eine neue Klasse von TCustomMemoryStream ableiten und deren SetPointer-Methode nutzen.
Zitat:

Zitat von Die Delphi-Hilfe ©Borland
TCustomMemoryStream.SetPointer Methode

Ersetzt den Speicherpuffer, der mit dem Speicher-Stream verbunden ist.

Klasse
TCustomMemoryStream

Syntax
Delphi-Quellcode:
procedure SetPointer(Ptr: Pointer; Size: Integer);
Beschreibung
Mit SetPointer kann der interne Speicherpuffer (Memory) auf den in Ptr übergebenen Wert gesetzt werden. Size ist die Anzahl Bytes, auf die Ptr zeigt.

Nachkommen von TCustomMemoryStream müssen SetPointer verwenden, um den Speicher-Stream mit dem Speicherpuffer zu verbinden, der die Daten für den Speicher-Stream enthält.

Hinweis:
SetPointer gibt den existierenden Wert von Memory (falls vorhanden) nicht frei, wenn der Speicherpuffer ersetzt wird. Nachkommen von TCustomMemoryStream, die mit Hilfe von SetPointer den Speicher-Pool des Streams ersetzen, müssen vor dem entsprechenden Aufruf von SetPointer den Speicher freigeben, auf den die Eigenschaft Memory zeigt.


//edit: alternativ kannst du auch einfach den Speicher auslesen (z.B. in ein Array of Byte) und dann dieses Array versenden

creality 23. Mai 2007 09:14

Re: MemoryStream auf Speicherinhalt?
 
Ok tolle Sache. Werde ich mal ausprobieren. Danke :balloon:

marabu 23. Mai 2007 09:29

Re: MemoryStream auf Speicherinhalt?
 
Hallo,

warum sollen denn die Daten aus dem Speicher erst in einen Stream verpackt werden? Die gängigen TCP-Komponenten beherrschen auch den Versand direkt ab Speicheradresse (Indy: WriteBuffer; VCL: SendBuf).

Grüße vom marabu

creality 23. Mai 2007 11:03

Re: MemoryStream auf Speicherinhalt?
 
Hallo zurück,

hmm...gute Frage. Ich nutze Indy10. Aber die ganze Sache ist mir irgendwie zu verwickt. Die Daten liegen quasi in einem NonPagedMem und werden dort von einer FrameGrabber Karte reingeschrieben.

Ich hab grad mal nachgesehen. Write() nimmt auch einen Buffer vom Typ TBytes entgegen. Stimmt. Du meinst ich sollte einfach Byte aussm Ram lesen und knallhart verschicken?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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