Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования для информатиков и инженеров. Часть 2 Прикладное программирование в Windows.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
603.45 Кб
Скачать

Свойства выделяемого блока памяти

 

Макрос

Значение

1

GHND

Блок может перемещаться и заполняется нулями

2

GMEM_DDESHARE

Память может использоваться для операций c буфером обмена

3

GMEM_DISCARDABLE

Память может быть выгружена

4

GMEM_LOWER

Память не перемещается

5

GMEM_NOCOMPACT

Блок может перемещаться в памяти

6

 

Блок не может изменять размер при операциях сборки мусора

7

GMEM_NODISCARD

Блок не может быть выгружен

8

GMEM_SHARE

To же, что и GMEM_DDESHARE

9

GMEM_ZEROINIT

Выделенный блок памяти заполняется нулями

10

GPTR

Блок памяти не может перемещаться и заполняется нулями

 

Память, выделенная при помощи функции GlobalAlloc(), становится глобальным системным объектом. Память, выделяемая для использования в буфере обмена, должна быть перемещаемой и разделяемой.

Как уже упоминалось, функция GlobalAlloc() возвращает дескриптор, а не указа­тель на выделенную память. Для получения указателя на область памяти, выделенную при помощи GlobalAlloc(), следует использовать функцию GlobalLock():

 

LPVOID GlobalLock(HGLOBAL hObj);

 

Функция GlobalLock() фиксирует в памяти объект (блок), дескриптор которого передается в параметре hObj. Зафиксированный объект не перемещается в памяти и не выгружается. Функция GlobalLock() возвращает адрес начала блока в случае успешного завершения или NULL при возникновении ошибки. Чтобы осуществить обращение к глобальным блокам памяти, эти блоки нужно обязательно зафиксиро­вать. Таким образом, вызов функции GlobalLock() – это способ получения указателя на блок глобальной памяти. Фиксация блока также предохраняет память от обраще­ния к ней других программ, пока с этой памятью работает Ваша программа.

После получения указателя на глобальный блок памяти необходимо скопировать в этот блок данные, которые Вы хотите поместить в буфер обмена. Когда копирование завершится, блок памяти можно разблокировать, вызвав функцию GlobalUnlock():

 

BOOL GlobalUnlock(HGLOBAL hObj);

 

Функция GlobalUnlock() возвращает нулевое значение в случае успешного завер­шения и ненулевое при возникновении ошибки. Дескриптор разблокируемого объек­та передается в параметре hObj.

После копирования данных в глобальный блок памяти нужно открыть буфер обмена при помощи вызова функции OpenClipboard():

 

BOOL OpenClipboard(HWND hWnd) ;

 

Функция OpenClipboard() разрешает вызывающей программе доступ к буферу обмена (т.е. открывает его). После того как программа открыла буфер обмена, другие приложения использовать его не могут. Функция возвращает ненулевое значение, если буфер обмена успешно открыт, и нуль, если в данный момент буфер открыть невозможно. Параметр hWnd задает дескриптор окна, открывающего буфер обмена.

Когда буфер обмена успешно открыт, приложение должно очистить буфер обмена, вызвав функцию EmptyClipboard():

 

BOOL EmptyClipboard(void);

 

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

Чтобы записать данные в буфер обмена, его следует настроить на память, содержа­щую эти данные. Это делается при помощи вызова функции SetClipboardData():

 

HANDLE SetClipboardData(UINT Format, HANDLE hData);

 

Функция SetClipboardData() настраивает буфер обмена на использование глобаль­ной памяти, дескриптор которой указывается в параметре hData. Она возвращает новый дескриптор памяти, на которую настроен буфер обмена, либо NULL в случае возникновения ошибки.

Формат данных, записываемых в буфер обмена, задается параметром Format. Этот параметр может принимать предопределенные значения из таблицы 13.5, либо задавать собственный формат данных пользователя.

 

Таблица 13.5