Como crio com segurança e corretamente um backup da área de transferência do Windows?

Estou tentando criar um backup da área de transferência do Windows. Basicamente, o que estou fazendo é usarEnumClipboardFormats() para obter todos os formatos que existem atualmente na área de transferência e, em seguida, para cada formato, estou chamandoGetClipboardData(format).

Parte do backup dos dados obviamente envolve a duplicação. Eu faço isso chamandoGlobalLock() (qual"Bloqueia um objeto de memória global e retorna um ponteiro para o primeiro byte do bloco de memória do objeto.") nos dados retornados porGetClipboardData(), busco o tamanho dos dados chamandoGlobalSize()e, finalmente, eu faço ummemcpy() duplicar os dados. Eu, claro, ligoGlobalUnlock() quando eu estiver pronto.

Bem, isso funciona ... na maioria das vezes. Meu programa falha noGlobalLock() se a área de transferência contiver dados com o formatoCF_BITMAP ouCF_METAFILEPICT. Depois de ler esta postagem no blog Old New Thing (http://blogs.msdn.com/b/oldnewthing/archive/2007/10/26/5681471.aspx) Descobri por que a falha ocorre: aparentemente nem todos os dados na área de transferência são alocados usandoGlobalAlloc() (tal comoCF_BITMAP dados) e assim chamandoGlobalLock() nesses dados causa uma falha.

Me deparei com este artigo do MSDN (http://msdn.microsoft.com/en-us/library/ms649014#_win32_Memory_and_the_Clipboard ) e fornece uma lista dos formatos da área de transferência e como eles são liberados pelo sistema. Então, o que eu fiz foi codificar no meu programa todos os formatos da área de transferência (CF_ *) que não são liberados peloGlobalFree() funcionar pelo sistema e simplesmente não faço backup desses formatos; Eu pulo eles.

Esta solução alternativa parece funcionar bem, na verdade. Mesmo se houver um bitmap na área de transferência ou dados "especiais" (como linhas copiadas do Excel para a área de transferência), minha função de backup da área de transferência funcionará bem e não ocorreram falhas. Além disso, mesmo que haja um bitmap na área de transferência e pulo alguns formatos durante o backup (comoCF_BITMAP), Ainda posso Ctrl + V colar o bitmap originalmente copiado da área de transferência após restaurar o backup da área de transferência, pois o bitmap é representado por outros formatos na área de transferência e que não causam falha no programa (CF_DIB)

No entanto, é uma solução alternativa, na melhor das hipóteses. Meu medo é que um desses momentos tenha algum formato estranho (talvez privado, ou seja, entreCF_PRIVATEFIRST eCF_PRIVATELAST, ou talvez algum outro tipo) estará na área de transferência e no meu programa, depois de ligarGlobalLock(), falhará novamente. Mas como não parece haver muita documentação explicando a melhor maneira de fazer backup da área de transferência, fica claro queGlobalLock() faznão funcionar corretamente para todos os tipos de dados (infelizmente), não sei como lidar com essas situações. É seguro assumir que todos os outros formatos - além dos listados no URL anterior, que não são liberados porGlobalFree() - pode ser "agarrado" usandoGlobalLock()?

Alguma ideia?

questionAnswers(1)

yourAnswerToTheQuestion