¿Cómo creo de forma segura y correcta una copia de seguridad del portapapeles de Windows?

Estoy tratando de crear una copia de seguridad del portapapeles de Windows. Básicamente lo que estoy haciendo es usarEnumClipboardFormats() para obtener todos los formatos que existen actualmente en el portapapeles, y luego para cada formato, estoy llamandoGetClipboardData(format).

Parte de la copia de seguridad de los datos obviamente implica duplicarlos. Lo hago llamandoGlobalLock() (cual"Bloquea un objeto de memoria global y devuelve un puntero al primer byte del bloque de memoria del objeto".) en los datos devueltos porGetClipboardData(), luego obtengo el tamaño de los datos llamandoGlobalSize(), y finalmente hago unmemcpy() para duplicar los datos. Entonces, por supuesto, llamoGlobalUnlock() Cuando termine.

Bueno, esto funciona ... la mayor parte del tiempo. Mi programa se bloquea en elGlobalLock() si el portapapeles contiene datos con el formatoCF_BITMAP oCF_METAFILEPICT. Después de leer esta publicación del blog Old New Thing (http://blogs.msdn.com/b/oldnewthing/archive/2007/10/26/5681471.aspx) Descubrí por qué ocurre el bloqueo: aparentemente no todos los datos en el portapapeles se asignan usandoGlobalAlloc() (comoCF_BITMAP datos), y así llamandoGlobalLock() en esos datos provoca un bloqueo.

Me encontré con este artículo de MSDN (http://msdn.microsoft.com/en-us/library/ms649014#_win32_Memory_and_the_Clipboard ) y proporciona una lista de formatos de portapapeles y cómo el sistema los libera. Entonces, lo que hice fue codificar en mi programa todos los formatos del portapapeles (CF_ *) que no son liberados por elGlobalFree() funciono por el sistema, y simplemente no hago una copia de seguridad de esos formatos; Me los salteo.

Esta solución parece funcionar bien, en realidad. Incluso si hay un mapa de bits en el portapapeles o datos "especiales" (como filas copiadas de Excel en el portapapeles), mi función de copia de seguridad del portapapeles funciona bien y no he experimentado ningún bloqueo. Además, incluso si hay un mapa de bits en el portapapeles y omito algunos formatos durante la copia de seguridad (comoCF_BITMAP), Todavía puedo Ctrl + V pegar el mapa de bits copiado originalmente del portapapeles después de restaurar mi copia de seguridad del portapapeles, ya que el mapa de bits también está representado por otros formatos en el portapapeles que no hacen que mi programa se bloquee (CF_DIB)

Sin embargo, es una solución alternativa en el mejor de los casos. Mi temor es que una de estas veces tenga un formato extraño (quizás uno privado, es decir, uno entreCF_PRIVATEFIRST yCF_PRIVATELAST, o tal vez algún otro tipo) estará en el portapapeles y mi programa, después de llamarGlobalLock(), se bloqueará de nuevo. Pero dado que no parece haber mucha documentación que explique la mejor manera de hacer una copia de seguridad del portapapeles, está claro queGlobalLock() haceno funciona correctamente para todos los tipos de datos (desafortunadamente), no estoy seguro de cómo manejar estas situaciones. ¿Es seguro asumir que todos los demás formatos, además de los formatos enumerados en la URL anterior que no son liberados porGlobalFree() - se puede "agarrar" usandoGlobalLock()?

¿Algunas ideas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta