Wie erstelle ich sicher und korrekt eine Sicherungskopie der Windows-Zwischenablage?

Ich versuche ein Backup der Windows-Zwischenablage zu erstellen. Grundsätzlich benutze ichEnumClipboardFormats(), um alle Formate abzurufen, die derzeit in der Zwischenablage vorhanden sind, und dann rufe ich für jedes Format @ auGetClipboardData(format).

Zum Sichern der Daten gehört natürlich das Duplizieren. Das mache ich indem ich @ ruGlobalLock() (welche "Sperrt ein globales Speicherobjekt und gibt einen Zeiger auf das erste Byte des Speicherblocks des Objekts zurück.") auf die von @ zurückgegebenen DatGetClipboardData(), dann hole ich die Größe der Daten durch Aufrufen vonGlobalSize(), und dann mache ich endlich einmemcpy(), um die Daten zu duplizieren. Ich rufe dann natürlichGlobalUnlock() wenn ich fertig bin

Nun, das funktioniert ... die meiste Zeit. Mein Programm stürzt am @ GlobalLock() wenn die Zwischenablage Daten im Format @ enthä CF_BITMAP oder CF_METAFILEPICT. Nach dem Lesen dieses Old New Thing Blog-Beitrags http: //blogs.msdn.com/b/oldnewthing/archive/2007/10/26/5681471.asp) Ich habe herausgefunden, warum der Absturz auftritt: Anscheinend werden nicht alle Daten in der Zwischenablage mit @ zugewieseGlobalAlloc() (sowie CF_BITMAP data) und so @ aufrufGlobalLock() auf diesen Daten verursacht einen Absturz.

Ich bin auf diesen MSDN-Artikel gestoßen http: //msdn.microsoft.com/en-us/library/ms649014#_win32_Memory_and_the_Clipboar) und es gibt eine Liste der Zwischenablageformate und wie sie vom System freigegeben werden. Also habe ich alle Zwischenablageformate CF _ *) die nicht vom @ befreit werdGlobalFree() wird vom System unterstützt, und diese Formate werden einfach nicht gesichert. Ich überspringe sie.

Diese Problemumgehung scheint tatsächlich gut zu funktionieren. Auch wenn sich eine Bitmap in der Zwischenablage befindet oder "spezielle" Daten (z. B. Zeilen, die aus Excel in die Zwischenablage kopiert wurden), funktioniert meine Zwischenablage-Sicherungsfunktion einwandfrei und es sind keine Abstürze aufgetreten. Auch wenn sich eine Bitmap in der Zwischenablage befindet und ich einige Formate während der Sicherung überspringe (wie z. B. CF_BITMAP) Kann ich die ursprünglich aus der Zwischenablage kopierte Bitmap nach dem Wiederherstellen meiner Zwischenablagesicherung immer noch mit Strg + V einfügen, da die Bitmap auch durch andere Formate in der Zwischenablage dargestellt wird, die nicht zum Absturz meines Programms führen CF_DIB).

Es ist jedoch bestenfalls eine Problemumgehung. Ich befürchte, dass eines dieser Male ein seltsames Format (vielleicht ein privates, d. H. Eines zwischen CF_PRIVATEFIRST und CF_PRIVATELAST, oder vielleicht ein anderer Typ) wird in der Zwischenablage und in meinem Programm sein, nachdem @ aufgerufen wurGlobalLock() wird wieder abstürzen. Aber da es nicht viel Dokumentation zu geben scheint, die den besten Weg zum Sichern der Zwischenablage erklärt, ist es klar, dassGlobalLock() doesnich funktioniert (leider) für alle Datentypen einwandfrei, ich bin mir nicht sicher, wie ich mit diesen Situationen umgehen soll. Ist es sicher anzunehmen, dass alle anderen Formate - außer den in der vorherigen URL aufgelisteten Formaten, die nicht von @ freigegeben wurdeGlobalFree() - kann mit @ "gepackt" werdGlobalLock()?

Irgendwelche Ideen

Antworten auf die Frage(2)

Ihre Antwort auf die Frage