AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MemoryStream auf Speicherinhalt?

Ein Thema von creality · begonnen am 23. Mai 2007 · letzter Beitrag vom 23. Mai 2007
Antwort Antwort
Benutzerbild von creality
creality

Registriert seit: 14. Mai 2007
Ort: Double D Town
39 Beiträge
 
Delphi 2007 Professional
 
#1

MemoryStream auf Speicherinhalt?

  Alt 23. Mai 2007, 07:21
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?
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: MemoryStream auf Speicherinhalt?

  Alt 23. Mai 2007, 07:30
Hi!

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

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

Klasse
TCustomMemoryStream

Syntax
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
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von creality
creality

Registriert seit: 14. Mai 2007
Ort: Double D Town
39 Beiträge
 
Delphi 2007 Professional
 
#3

Re: MemoryStream auf Speicherinhalt?

  Alt 23. Mai 2007, 09:14
Ok tolle Sache. Werde ich mal ausprobieren. Danke
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: MemoryStream auf Speicherinhalt?

  Alt 23. Mai 2007, 09:29
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
  Mit Zitat antworten Zitat
Benutzerbild von creality
creality

Registriert seit: 14. Mai 2007
Ort: Double D Town
39 Beiträge
 
Delphi 2007 Professional
 
#5

Re: MemoryStream auf Speicherinhalt?

  Alt 23. Mai 2007, 11:03
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?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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