2010-07-02 13 views
7

Sto provando a creare un backup degli Appunti di Windows. Fondamentalmente quello che sto facendo è utilizzare EnumClipboardFormats() per ottenere tutti i formati esistenti negli Appunti al momento, e quindi per ogni formato, sto chiamando GetClipboardData(format).Come creare un backup degli Appunti di Windows in modo sicuro e corretto?

Parte del backup dei dati implica ovviamente la duplicazione. Lo faccio chiamando lo GlobalLock() (che "blocca un oggetto di memoria globale e restituisce un puntatore al primo byte del blocco di memoria dell'oggetto.") sui dati restituiti da GetClipboardData(), quindi recupero la dimensione dei dati chiamando GlobalSize() e infine eseguo un memcpy() per duplicare i dati. Ovviamente, quando ho finito, chiamo lo GlobalUnlock().

Bene, questo funziona ... il più delle volte. Il mio programma si blocca allo GlobalLock() se gli appunti contengono dati con il formato CF_BITMAP o CF_METAFILEPICT. Dopo aver letto questo post del blog Old New Thing (http://blogs.msdn.com/b/oldnewthing/archive/2007/10/26/5681471.aspx) ho scoperto perché si verifica l'arresto anomalo: a quanto pare non tutti i dati negli Appunti vengono allocati utilizzando GlobalAlloc() (ad esempio CF_BITMAP dati) e quindi chiamare GlobalLock() in tali dati provoca un arresto anomalo.

Mi sono imbattuto in questo articolo MSDN (http://msdn.microsoft.com/en-us/library/ms649014#_win32_Memory_and_the_Clipboard) e fornisce un elenco di formati di appunti e di come vengono liberati dal sistema. Quindi quello che ho fatto è stato il codice fisso nel mio programma di tutti i formati degli appunti (CF_ *) che non sono stati liberati dalla funzione GlobalFree() dal sistema, e semplicemente non eseguo il backup di quei formati; Li salterò.

Questa soluzione sembra funzionare correttamente. Anche se negli appunti è presente una bitmap o dati "speciali" (come le righe copiate da Excel negli Appunti), la funzione di backup degli appunti funziona bene e non ho riscontrato arresti anomali. Inoltre, anche se c'è un bitmap negli appunti e salta alcuni formati durante il backup (come CF_BITMAP), posso ancora Ctrl + V incollare la bitmap originariamente copiata dagli appunti dopo aver ripristinato il backup degli appunti, poiché la bitmap è rappresentato anche da altri formati negli Appunti che non causano il crash del mio programma (CF_DIB).

Tuttavia, è una soluzione alternativa nel migliore dei casi. La mia paura è che una di queste volte un formato strano (forse uno privato, uno tra CF_PRIVATEFIRST e CF_PRIVATELAST, o forse qualche altro tipo) sarà negli appunti e il mio programma, dopo aver chiamato GlobalLock(), si bloccherà di nuovo . Ma dal momento che non sembra esserci molta documentazione che spiega il modo migliore per eseguire il backup degli appunti, è chiaro che GlobalLock() fa non funziona correttamente per tutti i tipi di dati (sfortunatamente), non sono sicuro di come gestire queste situazioni. È sicuro assumere che tutti gli altri formati - oltre ai formati elencati nell'URL precedente che non sono stati liberati da - possono essere "afferrati" usando GlobalLock()?

Qualche idea?

risposta

1

Questa è follia, poiché non è possibile eseguire il backup/ripristino degli appunti. Un sacco di app ha utilizzato il rendering ritardato e i dati non sono effettivamente negli appunti. Quando si richiede di incollare, ricevono una notifica e producono i dati. Ciò richiederebbe diversi minuti e centinaia di MB per grandi quantità di dati da app come Excel. Dai un'occhiata al numero di formati elencati negli appunti quando copi da Excel. Ci saranno più di due dozzine, tra cui Bitmap, Metafile, HTML.Cosa pensi che accadrà se selezioni 255x25000 celle in Excel e lo copi? Quanto sarebbe grande quella bitmap? Suggerimento: salva tutti i documenti aperti prima di provare a farlo, poiché probabilmente dovrai riavviare.

+0

1) Con il rendering ritardato, l'app produrrà i dati dopo che l'app chiama GetClipboardData(), corretta? 2) Supponiamo che si tratti di uno scenario ottimale, e c'è solo una piccola quantità di dati negli appunti. Come posso fare un backup sicuro di tutti questi dati? (vale a dire senza andare in crash) 3) Infine, assumiamo uno scenario peggiore e c'è una quantità enorme di dati non ancora resi negli appunti, come hai detto tu. C'è un modo per sapere che c'è un'enorme quantità di dati, quindi posso "saltare" il backup di questi dati? – YouCanSam

+0

Inoltre: se ho selezionato 255x25000 celle in Excel, lo ho copiato negli Appunti e quindi il mio programma l'ha eseguito il backup, non sarebbe lo stesso che premere Ctrl + V dopo aver copiato tutte quelle celle in Excel negli Appunti , dal momento che entrambe le operazioni (backup/Ctrl + V incolla) presumibilmente farebbero sì che Excel esegua il rendering dei dati? – YouCanSam

+0

# 1 corretto. # 2, sì si può sicuramente incollare bitmap, ecc. Senza crash. I Trova un esempio funzionante nella lingua che preferisci. # 3 Dovresti essere in grado di farlo, sì. E puoi scegliere quali formati catturare e quali abbandonare. –

Problemi correlati