Операционные системы. Учебное пособие. Марапулец Ю.В. - 169 стр.

UptoLike

Составители: 

В буфере обмена одновременно может находиться только по одному элементу дан-
ных каждого типа. Объясняется это той простой причиной, что не существует спо-
соба разделения нескольких элементов данных одного и того же типа. Однако при
наличии данных нескольких типов приложение, получившее доступ к буферу обме-
на, может запросить только один элемент, несколько элементов или все элементы. В
этом случае данные каждого типа должны запрашиваться отдельно.
Буфер обмена может многократно открываться для запроса других элементов дан-
ных или повторного запроса того же элемента. Но в целом, запрашивая фрагмент дан-
ных из буфера обмена, лучше всего создать его локальную копию, а не повторять один и
тот же запрос снова и снова. Кроме того, не забывайте: нет никакой гарантии того, что
при следующем запросе тот же самый элемент данных останется неизменным, посколь-
ку буфер обмена является общедоступным.
8.1.3. Частные форматы буфера обмена
В Windows определено несколько "частных" форматов: CF_DSPTEXT,
CF_DSPBITМАР, CF_DSPMETAFILEPICT и CF_DSPENHMETAFILE. Они соответст-
вуют форматам CF_TEXT, CF_BITMAP, CF_METAFILEPICT и CF_ENHMETAFILE, но
имеют одно принципиальное ограничение: приложения, запрашивающие стандартные
форматы, не смогут получить доступ к специальным форматам буфера обмена. В этой
связи следует сделать несколько замечаний.
Данные, находящиеся в одном из специальных форматов, предназначаются для об-
мена информацией между двумя экземплярами одного и того же приложения или
между двумя приложениями, специально разработанными для совместной работы.
В процессе подобного обмена может передаваться служебная информация, напри-
мер о форматировании и/или шрифтах.
Термин частный формат может ввести в заблуждение. Дело в том, что получить
доступ к таковому может любое приложение. Ведь разрабатывались подобные форматы
не в целях безопасности, а лишь для обеспечения закрытого обмена данными через бу-
фер обмена [12].
Хотя два экземпляра одного и того же приложения или два связанных приложения
должны понимать свои частные форматы, применение этих форматов вовсе не гаранти-
рует, что данные поступили от другого экземпляра того же приложения или родственно-
го приложения. Иными словами, ничто не мешает использованию одинаковых частных
форматов разными, совершенно не связанными друг с другом программами.
Однако на этот случай предусмотрены специальные меры. Вы можете узнать "ав-
тора" содержимого буфера обмена с помощью функции GetClipboardOwner():
hwndCBOwner = GetClipboardOwner();
Приложение, вызвавшее функцию EmptyClipboard() для подготовки к копирова-
нию данных, становится новым владельцем буфера обмена. Другие приложения, обра-
щающиеся к буферу для чтения информации, его владельцами не являются - они просто
получают доступ. Таким образом, за содержимое буфера обмена ответственность несет
только его владелец. Приложение не может записать данные в буфер обмена, не став
сначала его владельцем и не удалив его предыдущее содержимое. Поэтому любое при-
ложение, получившее доступ к информации в частном формате, может также опреде-
лить принадлежность буфера обмена.
Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий на вла-
дельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит. Но имея деск-
риптор, имя класса приложения можно запросить с помощью другой функции:
171
•   В буфере обмена одновременно может находиться только по одному элементу дан-
    ных каждого типа. Объясняется это той простой причиной, что не существует спо-
    соба разделения нескольких элементов данных одного и того же типа. Однако при
    наличии данных нескольких типов приложение, получившее доступ к буферу обме-
    на, может запросить только один элемент, несколько элементов или все элементы. В
    этом случае данные каждого типа должны запрашиваться отдельно.
     Буфер обмена может многократно открываться для запроса других элементов дан-
ных или повторного запроса того же элемента. Но в целом, запрашивая фрагмент дан-
ных из буфера обмена, лучше всего создать его локальную копию, а не повторять один и
тот же запрос снова и снова. Кроме того, не забывайте: нет никакой гарантии того, что
при следующем запросе тот же самый элемент данных останется неизменным, посколь-
ку буфер обмена является общедоступным.

     8.1.3. Частные форматы буфера обмена

      В Windows определено несколько "частных" форматов: CF_DSPTEXT,
CF_DSPBITМАР, CF_DSPMETAFILEPICT и CF_DSPENHMETAFILE. Они соответст-
вуют форматам CF_TEXT, CF_BITMAP, CF_METAFILEPICT и CF_ENHMETAFILE, но
имеют одно принципиальное ограничение: приложения, запрашивающие стандартные
форматы, не смогут получить доступ к специальным форматам буфера обмена. В этой
связи следует сделать несколько замечаний.
 • Данные, находящиеся в одном из специальных форматов, предназначаются для об-
    мена информацией между двумя экземплярами одного и того же приложения или
    между двумя приложениями, специально разработанными для совместной работы.
 • В процессе подобного обмена может передаваться служебная информация, напри-
    мер о форматировании и/или шрифтах.
      Термин частный формат может ввести в заблуждение. Дело в том, что получить
доступ к таковому может любое приложение. Ведь разрабатывались подобные форматы
не в целях безопасности, а лишь для обеспечения закрытого обмена данными через бу-
фер обмена [12].
      Хотя два экземпляра одного и того же приложения или два связанных приложения
должны понимать свои частные форматы, применение этих форматов вовсе не гаранти-
рует, что данные поступили от другого экземпляра того же приложения или родственно-
го приложения. Иными словами, ничто не мешает использованию одинаковых частных
форматов разными, совершенно не связанными друг с другом программами.
      Однако на этот случай предусмотрены специальные меры. Вы можете узнать "ав-
тора" содержимого буфера обмена с помощью функции GetClipboardOwner():

      hwndCBOwner = GetClipboardOwner();

     Приложение, вызвавшее функцию EmptyClipboard() для подготовки к копирова-
нию данных, становится новым владельцем буфера обмена. Другие приложения, обра-
щающиеся к буферу для чтения информации, его владельцами не являются - они просто
получают доступ. Таким образом, за содержимое буфера обмена ответственность несет
только его владелец. Приложение не может записать данные в буфер обмена, не став
сначала его владельцем и не удалив его предыдущее содержимое. Поэтому любое при-
ложение, получившее доступ к информации в частном формате, может также опреде-
лить принадлежность буфера обмена.
     Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий на вла-
дельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит. Но имея деск-
риптор, имя класса приложения можно запросить с помощью другой функции:

                                        171