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

UptoLike

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

позволит запрашивающему приложению найти первый подходящий для себя формат.
Исходное приложение может записывать данные в любом другом заданном порядке, на-
пример в порядке убывания степени надежности данных.
Если список форматов исчерпан, буфер обмена пуст или если он не был открыт,
результат выполнения функции EnumClipboardFormats() будет равен нулю. Параметру
wFormat можно присвоить некоторое значение, с тем чтобы повторно прочитать список,
начиная с используемого в данный момент формата. Кроме того, информацию о количе-
стве форматов данных, находящихся в буфере обмена, можно получить с помощью опе-
ратора:
nFormats = CountClipboardFormats();
Когда приложение установит, что буфер обмена содержит данные нужного типа,
процесс чтения этих данных будет состоять из двух этапов:
получение дескриптора блока памяти, соответствующего данным, которые находят-
ся в буфере обмена;
выполнение определенных операций с данными с использованием имеющегося де-
скриптора.
Первый этап выполнить очень просто с помощью функции RetrieveCB:
HANDLE RetrieveCB( HWND hwnd, WORD FormatCB )
{
HANDLE hCB;
if( ! IsClipboardFormatAvailable( FormatCB ) )
return( NULL ) ;
OpenClipboard( hwnd ); hCB = GetClipboardData( FormatCB );
CloseClipboard();
return( hCB );
}
Содержащаяся в этом фрагменте кода обобщенная процедура возвращает нетипи-
зированный дескриптор блока памяти, который соответствует данным, находящимся в
буфере обмена. Если запрашиваемый формат данных отсутствует, функция возвращает
значение NULL.
Следует отметить, что на операции, которые могут выполняться с буфером обмена,
налагается несколько ограничений.
Прежде чем копировать данные в буфер обмена, необходимо вызвать функцию
EmptyClipboard(), предназначенную для удаления текущего содержимого. Сам факт
доступа к буферу обмена еще не означает, что будет получен контроль над его со-
держимым. Функция EmptyClipboard() позволяет стать владельцем буфера и одно-
временно удалить его текущее содержимое.
Любое приложение может получить доступ к содержимому буфера обмена, но лишь
владелец буфера, т.е. приложение, вызвавшее функцию EmptyClipboard(), имеет
право записывать в него данные. Поскольку владельцем буфера обмена может быть
только одно приложение, данные, записанные предыдущим владельцем, удаляются,
даже если таковым было это же самое приложение.
Хотя в буфер обмена может быть записано несколько блоков данных, передавать их
нужно в течение одной операции. Буфер обмена нельзя открыть, записать в него
данные, закрыть, а затем снова открыть и добавить другие данные, не удалив пре-
дыдущий фрагмент.
170
позволит запрашивающему приложению найти первый подходящий для себя формат.
Исходное приложение может записывать данные в любом другом заданном порядке, на-
пример в порядке убывания степени надежности данных.
     Если список форматов исчерпан, буфер обмена пуст или если он не был открыт,
результат выполнения функции EnumClipboardFormats() будет равен нулю. Параметру
wFormat можно присвоить некоторое значение, с тем чтобы повторно прочитать список,
начиная с используемого в данный момент формата. Кроме того, информацию о количе-
стве форматов данных, находящихся в буфере обмена, можно получить с помощью опе-
ратора:

      nFormats = CountClipboardFormats();

     Когда приложение установит, что буфер обмена содержит данные нужного типа,
процесс чтения этих данных будет состоять из двух этапов:
 • получение дескриптора блока памяти, соответствующего данным, которые находят-
   ся в буфере обмена;
 • выполнение определенных операций с данными с использованием имеющегося де-
   скриптора.
     Первый этап выполнить очень просто с помощью функции RetrieveCB:

HANDLE RetrieveCB( HWND hwnd, WORD FormatCB )
{
    HANDLE hCB;

      if( ! IsClipboardFormatAvailable( FormatCB ) )
               return( NULL ) ;
      OpenClipboard( hwnd ); hCB = GetClipboardData( FormatCB );
      CloseClipboard();
      return( hCB );
}

     Содержащаяся в этом фрагменте кода обобщенная процедура возвращает нетипи-
зированный дескриптор блока памяти, который соответствует данным, находящимся в
буфере обмена. Если запрашиваемый формат данных отсутствует, функция возвращает
значение NULL.
     Следует отметить, что на операции, которые могут выполняться с буфером обмена,
налагается несколько ограничений.
 • Прежде чем копировать данные в буфер обмена, необходимо вызвать функцию
    EmptyClipboard(), предназначенную для удаления текущего содержимого. Сам факт
    доступа к буферу обмена еще не означает, что будет получен контроль над его со-
    держимым. Функция EmptyClipboard() позволяет стать владельцем буфера и одно-
    временно удалить его текущее содержимое.
 • Любое приложение может получить доступ к содержимому буфера обмена, но лишь
    владелец буфера, т.е. приложение, вызвавшее функцию EmptyClipboard(), имеет
    право записывать в него данные. Поскольку владельцем буфера обмена может быть
    только одно приложение, данные, записанные предыдущим владельцем, удаляются,
    даже если таковым было это же самое приложение.
 • Хотя в буфер обмена может быть записано несколько блоков данных, передавать их
    нужно в течение одной операции. Буфер обмена нельзя открыть, записать в него
    данные, закрыть, а затем снова открыть и добавить другие данные, не удалив пре-
    дыдущий фрагмент.

                                        170