- •6. Управление внутренними коммуникациями в ос
- •6.1. Общая характеристика коммуникаций
- •6.2. Концепции технологии «Клиент-Сервер»
- •6.3. Внутренние коммуникации между процессами
- •6.3.1. Неименованные каналы
- •6.3.2. Обмен сообщениями
- •6.3.3. Обмен данными через Clipboard
- •1. Подготовка данных для передачи в Clipboard;
- •1. Открытие Clipboard
- •2. Проверка наличия требуемого формата данных в Clipboard
- •3. Чтение данных из Clipboard
- •4. Закрытие Clipboard
- •6.3.4. Обмен данными по технологии dde
- •6.3.5. Обмен данными по технологии ole
- •Insert object
- •Раздел 6
1. Подготовка данных для передачи в Clipboard;
Посылку данных рассмотрим на примере передачи в Clipboard ASCIIZ - строки.
1) Выделяем блок глобальной динамической памяти:
HGLOBAL GHandle = GlobalAlloc(GMEM_MOVEABLE, strlen(P) + 1);
Где:
HGLOBAL GHandle - ссылка на блок динамической памяти;
P - указатель на передаваемую строку.
2) Фиксируем блок от перемещений на время передачи в него данных и одновременно получаем указатель на блок:
LPTSTR GPtr = (LPTSTR)GlobalLock(GHandle);
Где: GPtr - указатель на блок.
3) Копируем строку в память:
strcpy(GPtr, P);
4) Разрешаем перемещение блока памяти:
GlobalUnlock(GHandle);
2. Открытие Clipboard
Открытие Clipboard выполняется вызовом функции
OpenClipboard(),
которая возвращает True, если Clipboard не используется другим приложением. В этом случае возможны последующие действия с Clipboard.
3. Очистка Clipboard
Очистка Clipboard выполняется вызовом функции
EmptyClipboard(),
перед засылкой туда новых данных.
4. Посылка данных в Clipboard
Посылка данных в Clipboard заключается в передаче Clipboard ссылки на блок данных с указанием формата этих данных. Эти действия осуществляются с помощью функции:
SetClipboardData(cf_Text, GHandle).
После вызова этой функции Clipboard начинает владеть данными.
5. Закрытие Clipboard
Закрытие Clipboard выполняется вызовом функции
CloseClipboard(),
после которого Clipboard становится доступным другим приложениям.
Прием данных из Clipboard
Прием данных из Clipboard включает в себя следующие этапы:
Открытие Clipboard;
Проверка наличия требуемого формата данных в Clipboard;
Чтение данных из Clipboard;
Закрытие Clipboard.
1. Открытие Clipboard
Открытие Clipboard выполняется аналогично предыдущему случаю вызовом функции:
OpenClipboard().
2. Проверка наличия требуемого формата данных в Clipboard
Проверка наличия требуемого формата данных выполняется вызовом функции:
IsClipboardFormatAvailable(cf_Text),
которая возвращает True, если данные запрашиваемого формата присутствуют.
3. Чтение данных из Clipboard
Чтение данных, в случае успешного выполнения всех предыдущих операций, выполняется за несколько шагов:
1) Получение ссылки на блок памяти, содержащий данные требуемого формата:
HGLOBAL GHandle = GetClipboardData(cf_Text);
2) Получение адреса данного блока памяти и фиксирование его от возможных перемещений на время считывания данных:
LPTSTR GPtr = (LPTSTR)GlobalLock(GHandle);
3) Выделение локальной памяти для чтения в нее интересующих данных:
P = malloc(strlen(GPtr) + 1));
4) Копирование данных из глобальной памяти в локальную память:
strcpy(P, GPtr);
5) Разрешение перемещения глобального блока памяти:
GlobalUnlock(GHandle).
4. Закрытие Clipboard
Закрытие Clipboard в случае приема данных выполняется аналогично закрытию в случае передачи данных:
CloseClipboard().
Как видно из приведенного описания, для программной реализации обмена данными через Clipboard требуется выполнения достаточно большого количества действий. При этом, реализация обмена для других, более сложных форматов, таких, например, как «графическое изображение», становится еще более сложной.