Составители:
Рубрика:
– в процессе подобного обмена может передаваться служебная инфор-
мация, например о форматировании и/или шрифтах.
Термин частный формат может ввести в заблуждение. Дело в том, что
получить доступ к таковому может любое приложение. Ведь разрабатывались
подобные форматы не в целях безопасности, а лишь для обеспечения закрыто-
го обмена данными через буфер обмена [2].
Хотя два экземпляра одного и того же приложения или два связанных
приложения должны понимать свои частные форматы, применение этих фор-
матов вовсе не гарантирует, что данные поступили от другого экземпляра того
же приложения или родственного приложения. Иными словами, ничто не ме-
шает использованию одинаковых частных форматов разными, совершенно не
связанными друг с другом программами.
Однако на этот случай предусмотрены специальные меры. Вы можете уз-
нать «автора» содержимого буфера обмена с помощью функции
GetClipboardOwner():
hwndCBOwner = GetClipboardOwner();…
Приложение, вызвавшее функцию EmptyClipboard() для подготовки к ко-
пированию данных, становится новым владельцем буфера обмена. Другие
приложения, обращающиеся к буферу для чтения информации, его владельца-
ми не являются – они просто получают доступ. Таким образом, за содержимое
буфера обмена ответственность несет только его владелец. Приложение не
может записать данные в буфер обмена, не став сначала его владельцем и не
удалив его предыдущее содержимое. Поэтому любое приложение, получившее
доступ к информации в частном формате, может также определить принад-
лежность буфера обмена.
Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий
на владельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит.
Но имея дескриптор, имя класса приложения можно запросить с помощью
другой функции:
GetClassName( hwndCBOwner, SszClassName, 16 );…
Теперь значение переменной szClassName можно сравнить с именем класса
текущего приложения или списком имен классов связанных приложений и таким
образом выяснить источник информации, записанной в буфере обмена.
Передача копии исходной информации в буфер обмена подразумевает до-
полнительный расход памяти из-за необходимости дублировать блоки данных.
При некоторых обстоятельствах этот фактор может сыграть весьма сущест-
венную роль, особенно если копируемые блоки достаточно велики. Одно из
возможных решений заключается в том, чтобы передавать данные в буфер об-
мена, не сохраняя их копию, что полностью снимает проблему.
Но есть и другое решение, которое применяется, в частности, при переда-
че больших объемов информации: отложенное копирование. В этом случае
в буфер обмена непосредственно записывается только спецификация формата,
а вместо дескриптора глобального блока памяти соответствующему параметру
присваивается значение NULL:
86
– в процессе подобного обмена может передаваться служебная инфор-
мация, например о форматировании и/или шрифтах.
Термин частный формат может ввести в заблуждение. Дело в том, что
получить доступ к таковому может любое приложение. Ведь разрабатывались
подобные форматы не в целях безопасности, а лишь для обеспечения закрыто-
го обмена данными через буфер обмена [2].
Хотя два экземпляра одного и того же приложения или два связанных
приложения должны понимать свои частные форматы, применение этих фор-
матов вовсе не гарантирует, что данные поступили от другого экземпляра того
же приложения или родственного приложения. Иными словами, ничто не ме-
шает использованию одинаковых частных форматов разными, совершенно не
связанными друг с другом программами.
Однако на этот случай предусмотрены специальные меры. Вы можете уз-
нать «автора» содержимого буфера обмена с помощью функции
GetClipboardOwner():
hwndCBOwner = GetClipboardOwner();…
Приложение, вызвавшее функцию EmptyClipboard() для подготовки к ко-
пированию данных, становится новым владельцем буфера обмена. Другие
приложения, обращающиеся к буферу для чтения информации, его владельца-
ми не являются – они просто получают доступ. Таким образом, за содержимое
буфера обмена ответственность несет только его владелец. Приложение не
может записать данные в буфер обмена, не став сначала его владельцем и не
удалив его предыдущее содержимое. Поэтому любое приложение, получившее
доступ к информации в частном формате, может также определить принад-
лежность буфера обмена.
Хотя функция GetClipboardOwner() возвращает дескриптор, указывающий
на владельца буфера обмена, сам по себе этот дескриптор ни о чем не говорит.
Но имея дескриптор, имя класса приложения можно запросить с помощью
другой функции:
GetClassName( hwndCBOwner, SszClassName, 16 );…
Теперь значение переменной szClassName можно сравнить с именем класса
текущего приложения или списком имен классов связанных приложений и таким
образом выяснить источник информации, записанной в буфере обмена.
Передача копии исходной информации в буфер обмена подразумевает до-
полнительный расход памяти из-за необходимости дублировать блоки данных.
При некоторых обстоятельствах этот фактор может сыграть весьма сущест-
венную роль, особенно если копируемые блоки достаточно велики. Одно из
возможных решений заключается в том, чтобы передавать данные в буфер об-
мена, не сохраняя их копию, что полностью снимает проблему.
Но есть и другое решение, которое применяется, в частности, при переда-
че больших объемов информации: отложенное копирование. В этом случае
в буфер обмена непосредственно записывается только спецификация формата,
а вместо дескриптора глобального блока памяти соответствующему параметру
присваивается значение NULL:
86
Страницы
- « первая
- ‹ предыдущая
- …
- 84
- 85
- 86
- 87
- 88
- …
- следующая ›
- последняя »
