Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Binäre Daten aus einem MemoryStream in die Zwischenablage überführen (https://www.delphipraxis.net/166728-binaere-daten-aus-einem-memorystream-die-zwischenablage-ueberfuehren.html)

ASM 27. Feb 2012 13:09

Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
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 ?

Bernhard Geyer 27. Feb 2012 13:12

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

Zitat von ASM (Beitrag 1153139)
... Mein Stream enthält jedoch neben mehreren Abschnitten mit AnsiText auch mehrfach $0-Bytes,

Wie wäre es diese Bereiche Base64-Codiert zu übertragen?

shmia 27. Feb 2012 14:04

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Bummi 27. Feb 2012 14:41

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi shima, danke, ich habe mich beim Umbau nur auf den Streamteil konzentriert, der funktioniert hervorragend.

ASM 27. Feb 2012 20:18

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
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.

ASM 29. Feb 2012 21:40

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
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.

einbeliebigername 1. Mär 2012 09:13

AW: Binäre Daten aus einem MemoryStream in die Zwischenablage überführen
 
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.

ASM 1. Mär 2012 11:39

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

Zitat von einbeliebigername (Beitrag 1153764)
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.

einbeliebigername 1. Mär 2012 13:11

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

Zitat:

Zitat von ASM (Beitrag 1153797)
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.

Zitat:

Zitat von ASM (Beitrag 1153139)
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?


Zitat:

Zitat von ASM (Beitrag 1153730)
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.

Zitat:

Zitat von ASM (Beitrag 1153730)
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.

Zitat:

Zitat von ASM (Beitrag 1153730)
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.

Zitat:

Zitat von ASM (Beitrag 1153730)
, 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.


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