Мое понимание заключается в том, что, когда вы добавляете дескриптор в буфер обмена, буфер обмена тогда владеет дескриптором, и вы несете ответственность за его удаление, и его не следует удалять. Это то, что он говорит здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms649051%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396, который освобождает дескриптор в SetClipboardData (CF_BITMAP, HBITMAP)?
Если SetClipboardData успешно, система принадлежит объект, идентифицированный : параметр hMem. Приложение не может записывать или освобождать данные после того, как право собственности было передано системе, но оно может заблокировать и считать данные, пока не будет вызвана функция CloseClipboard. (Память должна быть разблокирована до закрытия буфера обмена.) Если параметр hMem идентифицирует объект памяти, объект должен быть , назначенный с помощью функции с флагом GMEM_MOVEABLE.
И действительно я вижу много примеров, когда люди называют GlobalAlloc(), поставить какой-нибудь текст в глобальной ручке, вызовите SetClipboardData(), а затем не освобождает глобальную ручку, так как буфер обмен она владеет.
Но в случае данных HBitmap, добавленных через SetClipboardData(CF_BITMAP, hBitmap)
, я вижу много примеров, как эти:
https://stackoverflow.com/a/7292773/384670
https://stackoverflow.com/a/28248531/384670
В этих случаях код делает удалить HBITMAP после добавления его в буфер обмена.
Есть ли разница между дескриптором HBITMAP и дескриптором GlobalAlloc() относительно буфера обмена? Есть ли что-то особенное в CF_BITMAP, которое является исключением из правила, и буфер обмена копий ручка вместо принадлежит? Можете ли вы указать мне официальную (MSDN) документацию, объясняющую разницу?
Edit:
Вот еще один пример, который включает в себя оба типа ручки в одной статье: http://www.codeproject.com/Articles/42/All-you-ever-wanted-to-know-about-the-Clipboard
Обратите внимание, что в случае точечного рисунка автор прямо говорит:
// копия была сделана в буфере обмена, поэтому мы можем удалить
Я бы сказал, что эти примеры неверны.Документы четко говорят, что буфер обмена владеет объектом после успешного вызова «SetClipboardData». –
Да, я согласен, это то, что говорят документы. Но я добавил еще один пример, в котором оба типа дескриптора используются в одной статье. Это, конечно, похоже на то, что есть что-то особенное в битмап-данных. –
Я думаю, что единственное, что особенное, - это то, что ОС имеет защиту от удаления дескриптора GDI, отличного от его владельца. –