Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 137

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 173 >> Следующая

В буфер можно добавить несколько блоков данных при условии, что они имеют разные форматы. При добавлении в буфер данных в зарегистрированном формате, необходимо также добавить эквивалентный блок данных, соответствующий стандартному формату. Это позволит отображать или получать данные тем программам, которые не знакомы с вашим пользовательским форматом. Например, при добавлении в буфер специально отформатированного текста добавьте простой текст.
::SetClipboardData (TextFormat, HFormattedText); ¦.-.SetClipboardData (CF_TEXT, HPlainText) ;
В примере HFormattedText — дескриптор блока текста в пользовательском формате, HPlainText — в стандартном текстовом формате буфера, a TextFormat — индекс пользовательского формата, возвращенный функцией : :RegisterClipboardFormat.
Чтобы к вашим данным получили доступ как можно больше программ Windows, необходимо добавить достаточно много форматов. Очевидно, что одни форматы могут быть более информативными по сравнению с другими. В примере, приведенном выше, текст в пользовательском формате более информативен, чем простой текст.
Совет
Программы Windows обычно вызывают функцию : :EnumClipboardFormats, перенумеровывающую доступные форматы буфера, и используют первый формат, который они могут
воспринять. Поскольку функция : :ЕпитС1ірЬоагс1Гогтаіз сообщает форматы в том порядке, в котором они добавлялись в буфер, то необходимо добавлять сначала более информативные, а затем менее информативные форматы. Вследствие этого другие программы будут использовать наиболее информативные форматы данных.
Итоги
В этой главе мы создали программу для запуска и управления новыми процессами. Ознакомились с некоторыми способами связи и координации действий отдельных процессов: применением объектов синхронизации, передачей данных по каналам и с помощью общих блоков памяти, а также обменом данных при использовании буфера. Перечислим наиболее важные моменты.
• Новый процесс создается при выполнении программы. Альтернативой этому является способ, при котором программа, называемая родительской, вызывает функцию Win32 API : : CreateProcess для запуска другой, дочерней, программы.
• Функция :: CreateProcess предоставляет дескриптор дочернего процесса. Родительский процесс передает его одной из нескольких функций Win32 API: функции : : GetExitCodeProcess для получения кода возврата процесса, функции ::WaitForSingleObject для ожидания завершения процесса, функции : : SetPriorityClass для изменения приоритета процесса или : :TerminateProcess для его остановки.
• Для синхронизации отдельных процессов используются мьютексы, семафоры или события. При этом каждый процесс получает собственный дескриптор объекта синхронизации.
• Если задать объекту ИМЯ при вызове функции : : Create. . . (: : CreateMutex, ::CreateSemaphore ИЛИ ::CreateEvent) ИЛИ : :Open. . . (: : OpenMutex, : : OpenSemaphore ИЛИ : : OpenEvent), то отдельные процессы получают дескрипторы общих объектов синхронизации.
• При передаче идентификатора процесса в функцию : :OpenProcess программа получает дескриптор другого процесса даже в том случае, если она не является родителем этого процесса.
• Анонимным каналом называется механизм обмена информацией между процессами (обычно родительским и дочерним) аналогично записи файлов на диск и чтения с него.
• При обмене информацией между процессами с использованием общей памяти оба процесса вызывают функции : : CreateFileMapping и : :MapViewOf File.
• Использование буфера облегчает обмен простыми данными. При этом они должны соответствовать одному из стандартных форматов (текста или растрового изображения) или зарегистрированному пользовательскому формату, воспринимаемому программой.
• Доступ к буферу обмена предоставляется с помощью команд Cut, Сору и Paste меню Edit.
• Копируя блок текста в буфер обмена (команды Cut или Сору) или вставляя текст из буфера (команда Paste), можно обмениваться текстовой информацией.
Чтобы скопировать текст в буфер, вызывается функция : : GlobalAlloc, выделяющая блок памяти. Текст копируется в этот блок, а затем буфер снабжается дескриптором выделенной области памяти.
Чтобы вставить текст из буфера, запрашивается дескриптор блока памяти, содержащий текст. Этот дескриптор можно использовать для чтения или копирования текста в закрытую область памяти.
Копируя растровое изображение в буфер или вставляя растровое изображение из буфера, можно обмениваться графической информацией.
При копировании растрового изображения в буфер обмена передается дескриптор растрового изображения.
При вставке растрового изображения из буфера запрашивается дескриптор этого изображения, а затем программа отображает его или делает копию.
Обмен данными, которые не соответствуют ни одному из стандартных форматов буфера, осуществляется с помощью функции : : RegisterClipboardFormat, регистрирующей собственный формат. Для обмена текстовыми данными с помощью буфера можно использовать соответствующие процедуры. При этом вместо индекса, указывающего на текстовый формат, передается индекс, возвращаемый функцией : :RegisterClipboardFormat.
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100