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

UptoLike

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

for( i=0; i<wLen; i++ )
*lpGMem = *lpText++;
GlobalUnlock( hGMem );
return( TransferToClipboard( hwnd, hGMem, CF_TEXT ) );
}
После копирования текста вызывается функция GlobalUnlock, которая
отменяет блокировку дескриптора hGMem, разрешая перемещение и повторное
выделение блока памяти. Если бы блок памяти был перемещен до копирования
текста, указатель lpGMem стал бы недействительным.
В завершение процесса передачи данных вызывается рассмотренная
выше функция TransferToClipboard с указанием дескриптора блока hGMem,
флага CF_TEXT
и дескриптора окна приложения.
Чтение текста. Чтение текста из буфера обмена осуществляется столь же
просто, как и запись, однако отдельная процедура при этом не вызывается, а
действия выполняются в ответ на сообщение WM_PAINT.
Это позволяет
приложению при необходимости обновлять окно.
Операции чтения начинаются с открытия буфера обмена и вызова API-
функции GetClipboardData, которая возвращает дескриптор блока памяти,
принадлежащего буферу:
OpenClipboard( hwnd);
hTextMem = GetClipboardData( CF_TEXT );
lpText = GlobalLock( hTextMem );
Как и при записи данных в буфер обмена, функция GlobalLock блокирует
область памяти и ее адрес сохраняется в переменной lpText. Но на этот раз
содержимое строки копируется из области памяти (переменная lpText) в
локальную переменную TextStr не в цикле, а напрямую, с помощью функции
lstrcpy:
lstrcpy( TextStr, lpText );
GlobalUnlock( hTextMem );
CloseClipboard();
Наконец, функция GlobalUnlock снимает блокировку области памяти, а
функция CloseClipboard завершает сеанс работы с буфером обмена. Важно
помнить, что область памяти никогда не должна оставаться заблокированной и
вызов функции GlobalLock всегда должен сопровождаться вызовом
GlobalUnlock.
35
     for( i=0; i