AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
Thema durchsuchen
Ansicht
Themen-Optionen

Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

Ein Thema von ASM · begonnen am 27. Feb 2012 · letzter Beitrag vom 1. Mär 2012
Antwort Antwort
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#1

Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 27. Feb 2012, 14:09
Ich habe einen MemoryStream. Dessen Daten möchte ich in die Zwischenablage kopieren, weil ich die Daten in einem anderen Programm brauche und dabei leider kein Weg über ein COM-Interface möglich ist, sondern nur per copy & paste.

Wäre an sich ja kein Problem mit einem der standardmäßigen ClipBoard Formate (wie z.B. CF_TEXT, CF_UNICODETEXT, etc). Mein Stream enthält jedoch neben mehreren Abschnitten mit AnsiText auch mehrfach $0-Bytes, ist also als binär zu behandeln. Somit ist die Übergabe an das Clipboard mit Hilfe des Formates CF_TEXT ausgeschlossen. Ein proprietäres ClipBoard Format CF_BINARY gibt es aber nicht.

Es ginge zwar notfalls auf dem Umweg über das Format CF_HDROP, wozu jedoch zunächst erst einmal die Abspeicherung der Streamdaten als File notwendig ist, auf welches dann durch Verwendung einer PDropFiles-Variablen (cf. ShlObj) zugegriffen werden muss. Gefällt mir aber nur als äußerste Notlösung.

Ich habe mehrfache Versuche unternommen, ein selbstdefiniertes, binäres Format zu deklarieren und mittels RegisterClipboardFormat() im System anzumelden, um damit dann die Daten unmittelbar aus dem Stream in das Clipboard befördern zu können, was aber bisher nicht zum Erfolg geführt hat.

Hat jemand eigene Erfahrung oder einen erfolgversprechenden Vorschlag ?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 27. Feb 2012, 14:12
... Mein Stream enthält jedoch neben mehreren Abschnitten mit AnsiText auch mehrfach $0-Bytes,
Wie wäre es diese Bereiche Base64-Codiert zu übertragen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 27. Feb 2012, 15:04
Die Klasse TAdvClipboard kann auch Streams ins Clipboard anfügen und auslesen.
Wurde allerdings noch mit Delphi 5 programmiert.
Wenn das jemand mit D2010 und höher kompatibel machen möchte, hätte ich gerne das Ergebnis zurück.
Angehängte Dateien
Dateityp: zip ClipboardTools.zip (2,6 KB, 22x aufgerufen)
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 27. Feb 2012, 15:41
Hi shima, danke, ich habe mich beim Umbau nur auf den Streamteil konzentriert, der funktioniert hervorragend.
Angehängte Dateien
Dateityp: pas ClipboardTools.pas (10,2 KB, 26x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 27. Feb 2012, 21:18
Erst einmal danke für die Anregungen.

Wie man einen Stream nicht-binärer Daten in die Zwischenablage transferiert, war mir allerdings ja schon mit "klassischen" Prozeduren unter Delphi7 geläufig (ohne spezielle Klasse TAdvClipboard).

Aber selbst die Methode ReadStream() von TAdvClipboard benötigt als Parameter explizit das genaue CF-Format der zu übertragenden Daten. Da es nun nach wie vor kein offizielles Format CF_BINARY gibt, bleibt also das eigentliche Problem mit binären Daten im Stream bestehen. Trotz eigener Deklaration eines CF_BINARY mittels RegisterClipboardFormat() funktioniert das mit binären Daten auch mit Hilfe der Methode ReadStream() der Klasse TAdvClipboard nicht. Hat das mit einem Stream binärer Daten wirklich schon einmal jemand in der Praxis erfolgreich versucht ?

Das Base64-Encoding der binären Daten im Stream hätte eine mögliche Lösung sein können und funktioniert per se auch bestens. Aber das Zielprogramm, das vom Steuerprogramm aus die Anweisung bekommt, die Daten aus der Zwischenablage per paste zu laden, kann mit den derart codierten Daten nichts anfangen, da es kein Base64-Decoding kennt. Das geht als nur mit den originalen, binären Daten.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 29. Feb 2012, 22:40
Durch einige Experimente, u.a auch unter Verwendung des von mir modifizierten Quellcodes des CLIPBOARD-ANALYZER aus dem Telecharger-Pool von DelphiFr, habe ich die Ursache meiner bisherigen Fehlschläge herausgefunden.

Die entscheidende Aufklärung hat schließlich die Idee gebracht, sofort nach der Ausführung von CopyStreamToClipboard(CF_BINARY, MemStream) ein CopyStreamFromClipboard(CF_BINARY, Filestream) anzuweisen. Und tatsächlich lagen anschließend die binären, aus bem Memorystream stammenden Daten komplett im derart abgespeicherten File vor.

Somit funktioniert der Transfer der binären Daten in das Clipboard nach Anmeldung des selbstdefinierten Clipboardformats "CF_BINARY" vielmehr eben doch fehlerlos.

Die Ursache des von mir anfangs beschriebenen Problems liegt im Empfängerprogramms selbst, da es das von mir definierte Format "CF_BINARY" nicht kennt bzw. trotz dessen Anmeldung im System nicht akzeptieren will und daher die Übernahme der binären Daten per paste aus dem Clipboard verweigert. Schreibe ich dagegen selbst ein separates Empfängerprogramm, das dieses Clipboardformat kennt, kann es auch die binären direkt aus dem Clipboard übernehmen.

Leider gibt es kein allgemein bekanntes StandardClipboardformat für solche binäre Daten, weshalb für das spezielle, eigentliche Empfängerprogramm der Umweg über die Zwischenspeicherung der Daten als File unumgänglich ist, das dann vom Empfängerprogramms eingelesen werden muss.
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#7

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 1. Mär 2012, 10:13
Hallo,

also du willst Daten über die Zwischenablage an ein anderes Programm transferieren. Wie heißt den das Programm? Könnte man es kennen? Weil du kannst dir Formate ausdenken und registrieren wie du willst. Es gibt kein Algorithmus der in deinem Kopf nachschaut und die Daten der Zwischenablage korrekt interpretiert. Wenn man sowas machen will geht man eigentlich einen anderen Weg.

Zuerst startet man das Programm, wo die Daten über die Zwischenablage rein sollen, zweimal und versucht diese Art von Daten per Kopieren und Einfügen von einer Instanz zur Anderen zu bekommen. Damit stellt man erst mal sicher, dass das Vorhaben überhaupt funktionieren könnte. Wenn man das Programm nicht zweimal unter einer Benutzeranmeldung starten kann, nimmt man zwei Rechner und baut zwischen denen eine RDP-Verbindung auf. In den Einstellungen der RDP-Verbindung kontrollieren, dass die Zwischenablage über die Verbindung übertragen wird. Den Test mit der RDP-Verbindung kann man auch gleich machen, weil man so testen kann ob das Programm das Kopieren und Einfügen über die Zwischenablage macht. Funktioniert dies erst mal, kann man dann mit einem Analyseprogram sich die Daten der Zwischenablage anschauen, den Aufbau dieser untersuchen und dann einen Algorithmus schreiben, welcher Daten in dem Format in die Zwischenablage kopiert.

Stellt man beim Testen fest, das sich entweder diese Art von Daten im Programm nicht kopieren lassen oder dabei nicht die Zwischenablage benutzt wird, bleibt nur noch der Blick in die Dokumentation des Programms oder eine Nachfrage beim Hersteller übrig.

einbeliebigername.
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 1. Mär 2012, 12:39
Es gibt kein Algorithmus der in deinem Kopf nachschaut und die Daten der Zwischenablage korrekt interpretiert.
Ach, sowas aber auch ! Dabei hatte ich fest angenommen, dass das heute technisch möglich wäre ...

P.S.
Vielleicht liest Du aber erst einmal meinen Beitrag hinreichend sorgfältig, bevor Du Dich im übrigen um eine derart verkorkste "Anleitung" bemühst.
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#9

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen

  Alt 1. Mär 2012, 14:11
Hallo,

P.S.
Vielleicht liest Du aber erst einmal meinen Beitrag hinreichend sorgfältig, bevor Du Dich im übrigen um eine derart verkorkste "Anleitung" bemühst.
Ja das hatte ich und habe deine Beiträge nochmal durchgelesen und komme jetzt zu Erkenntnis, dass du anscheinend von dem Thema Zwischenablage keine Ahnung hast. Ich habe bestimmt schon bei einem halbem dutzend Programmen versucht Daten über die Zwischenablage in diese zu bekommen. Mal mit Erfolg und mal mit der Erkenntnis, dass die Zwischenablage vom Programm gar nicht benutzt wird.

Ich habe einen MemoryStream. Dessen Daten möchte ich in die Zwischenablage kopieren, weil ich die Daten in einem anderen Programm brauche und dabei leider kein Weg über ein COM-Interface möglich ist, sondern nur per copy & paste.
Anscheinend hast du ein nicht von dir geschriebenes Programm vor dir, wo du Daten aus einem von dir geschriebenen Programm automatisiert einfügen willst. Denn den Weg über die Zwischenablage geht man nur wenn man den Sourcecode zu dem Programm nicht hat und dieses auch keine andere Schnittstelle anbietet um dies zu tun. Ansonsten ist jeder andere Weg besser. Aber um welches Programm geht es denn?


Die Ursache des von mir anfangs beschriebenen Problems liegt im Empfängerprogramms selbst, da es das von mir definierte Format "CF_BINARY" nicht kennt bzw. trotz dessen Anmeldung im System nicht akzeptieren will und daher die Übernahme der binären Daten per paste aus dem Clipboard verweigert.
Falsche Schlussfolgerung. Das Programm ignoriert dein Format einfach, weil es dieses nicht kennt. Sprich der Algorithmus des Programmes zum lesen aus der Zwischenablage kann die Daten deines Formates nicht in die Form, in der das Programm Daten intern Verwaltet, überführen.

Schreibe ich dagegen selbst ein separates Empfängerprogramm, das dieses Clipboardformat kennt, kann es auch die binären direkt aus dem Clipboard übernehmen.
Nun hast du ein Algorithmus geschrieben, welcher dein Format interpretieren kann.

Leider gibt es kein allgemein bekanntes StandardClipboardformat für solche binäre Daten
Kann ja auch nicht, weil Binär-Daten keinem Standartformat folgen.

Und jetzt stellt sich mir noch die Frage was für Binär-Daten du hast? Was steht da denn drin?

Und noch was zu meinem Vorgehen. Es ist durchaus wahrscheinlicher, dass ein Programm Formate aus der Zwischenablage lesen kann, welche es auch selber in die Zwischenablage schreibt.

, eigentliche Empfängerprogramm der Umweg über die Zwischenspeicherung der Daten als File unumgänglich ist, das dann vom Empfängerprogramms eingelesen werden muss.
Aber du hast ja einen Weg ohne die Zwischenablage gefunden. Der ist zwar auch nicht schön, weil erst eine Datei geschrieben werden muss, aber er ist besser als die Benutzung der Zwischenablage.

einbeliebigername.
  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 04:59 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