Уровень сложностиПростой
Время на прочтение9 мин
Количество просмотров462
Когда необходимо обеспечить взаимодействие c данными вашего приложения, можно использовать специальные механизмы операционной системы. Если говорить о приложениях WIndows, то для них доступно множество различных механизмов, но в рамках этой статьи коснемся только некоторых из них:
-
Открытие файлов через ассоциацию с приложением
Это классический метод, когда файл открывается двойным щелчком, при этом в системе должно быть определено, какая программа обрабатывает открытие файла данного расширения. В результате будет автоматически запущено связанное с расширением файла приложение и система передаст ему путь к файлу в форме параметра командной строки.
-
Реализация собственного протокола в системе
Этот механизм позволяет приложениям обрабатывать специфические ссылки. Например, при установке мессенджера Telegram в Windows регистрируется протокол
tg://
. Когда пользователь нажимает на такую ссылку в браузере или документе, система понимает, что ее должен обработать клиент Telegram, поскольку информация о протоколе хранится в реестре Windows. Такая возможность реализуется по аналогии с типовыми протоколами, такими какhttp://
,mailto:
илиftp://
, — разработчики могут создавать собственные, кастомные протоколы для запуска приложений и передачи в них данных. -
Механизм Drag & Drop (перетаскивание файлов)
Drag In (перетаскивание внутрь) — когда пользователь перетаскивает файл в окно приложения, то программа его открывает.
Drag Out (перетаскивание наружу) — приложение позволяет пользователю «вытянуть» объект за пределы окна приложения, передав его в другую программу или создав файл-ярлык в Windows.
-
Копирование и вставка данных через буфер обмена
Буфер обмена Windows позволяет приложениям передавать данные между собой с помощью копирования и вставки. Информация в буфере может храниться в разных форматах: простой текст, изображения, файлы, специальные ссылки и даже структурированные данные в виде XML или JSON. Возможна регистрация и использование своего уникального формата данных.
Поскольку я сейчас работаю над проектами, связанными с ЛОЦМАН:PLM, на примере десктопного приложения ЛОЦМАН:PLM Клиент покажу, где применяются эти механизмы. А в примерах кода более подробно продемонстрирую, как можно реализовать их в приложениях, написанных в Lazarus IDE.
ЛОЦМАН:PLM — это решение для управления инженерными данными и жизненным циклом изделий, разрабатываемое компанией АСКОН. Система предоставляет инструменты для работы с данными на всех этапах жизненного цикла продукта.
Десктопный клиент ЛОЦМАН:PLM — это классическое Windows-приложение, которое позволяет пользователю работать с базой данных комплекса PLM, управляя проектами и информационными объектами. В зависимости от своей роли пользователь может взаимодействовать с определёнными типами объектов, обеспечивающих поддержку различных этапов жизненного цикла изделия. Это могут быть объекты системной инженерии, а также конструкторской или технологической подготовки производства.
ЛОЦМАН:PLM Клиент работает с понятием информационного объекта, который имеет идентификационные данные, позволяющие ссылаться на него. Для передачи этих данных и последующего поиска соответствующего объекта в приложении реализованы специальные функции.
Примеры функций работы с объектом в ЛОЦМАН:PLM Клиент
Клиент поддерживает копирование и вставку объектов через буфер обмена. Если в дереве выбрать объект и скопировать его в буфер обмена, через пункт контекстного меню или с помощью горячих клавиш, то данные в буфере обмена будут сохранены в специальном формате LoodsmanBuffer
.
Для анализа содержимого буфера обмена можно воспользоваться утилитой Free Clipboard Viewer, она позволит увидеть как там хранится информация скопированная в него. Утилита покажет, что в записи LoodsmanBuffer
хранится информация в виде JSON-объекта следующего содержания:
Сам формат LoodsmanBuffer
поддерживается только ЛОЦМАН:PLM, вставить такие данные в другие приложения не получится.
Однако, для передачи информации о конкретных объектах во внешние программы или пересылки ее пользователям, реализован механизм создания специальных ссылок. Выделив объект в дереве, можно воспользоваться командой «Инструменты → Ссылки → Копировать ссылку», после чего в буфер обмена будет помещена строка следующего вида: ask:Loodsman.URL?Action=Navigate,params=NTF8REJfTkFNRXw0ODR8NDg1fHw0ODV8NDU4fDQ3OXw1MDR8NTA1
Здесь можно видеть что эта ссылка зарегистрированного протокола, которая имеет специальный формат, в которой ask:
— это имя протокола, который обрабатывает ЛОЦМАН:PLM Клиент. Параметр Action=Navigate
говорит приложению о том, что нужно перейти в дереве объектов на определенный объект, а params=
содержит закодированную в Base64 строку, содержащую идентификационные данные.
Декодированная строка имеет следующий вид: 51|DB_NAME|484|485||485|458|479|504|505,
Здесь в строке, через разделитель |
указаны имя базы данных и уникальные идентификаторы объектов: выбранного и его родительского.
Ссылка может быть вставлена в текст и будет обрабатываться как гиперссылка. При переходе по этой ссылке система автоматически запустит ЛОЦМАН:PLM Клиент, и передаст ему ее в качестве параметра. Клиент в свою очередь обработает полученные данные, найдет в дереве и выделит требуемый объект.
Помимо копирования в буфер обмена, имеется еще один способ создания ссылки на объект — это перетаскивание объекта за пределы приложения. В этом случае ЛОЦМАН:PLM Клиент генерирует специальный файл-ярлык (.lnk), который сохраняется в том месте, где пользователь отпустит кнопку мыши после перетаскивания.
Внутри файла хранится информация в следующем виде:
[InternetShortcut]
URL=ask:Loodsman.URL?Action=Navigate,params=MHxBS19QbG0wMXwyODk4fDEwMTI=
IconIndex=0
IconFile=C:\Program Files (x86)\ASCON\Loodsman\Client\Loodsman.exe
При двойном клике по ярлыку, как и при щелчке по ссылке вида ask:
автоматически запускается ЛОЦМАН:PLM Клиент, или активируется уже запущенный экземпляр. А далее он получает из ярлыка необходимые данные и отображает окно с нужным объектом.
Файл-ярлык с расширением .lnk — это стандартный ярлык в системе Windows, предназначенный для быстрого доступа к программам, файлам, папкам или сетевым ресурсам. Его обработку выполняет сама система. Однако, помимо этого, ЛОЦМАН:PLM может работать с собственными ярлыками, поскольку при установке регистрируются следующие типы файлов, которые открываются с помощью приложения:
-
.lnd -Loodsman.LinkDocument (Ссылка на документ ЛОЦМАН:PLM)
-
.lnf — Loodsman.LinkFile (Ссылка на файл ЛОЦМАН:PLM)
-
.lno — Loodsman.LinkObject (Ссылка на объект ЛОЦМАН:PLM)
Выше были приведены примеры применения системных механизмов на примере ЛОЦМАН:PLM, а далее будет приведена информация для реализации этих механизмов в собственном приложении.
Реализация механизмов в собственном приложении
В качестве примеров буду использовать код из заглушки, которая была написана для партнёров, разрабатывающих механизм интеграции с ЛОЦМАН:PLM. Заглушка позволяла протестировать нужный функционал без установки и развёртывания всего комплекса PLM на машинах разработчиков. Конечно, после отладки основных взаимодействий между приложениями, комплекс PLM был развернут на отдельной машине и уже там тестировалась совместная работа в полном объёме.
Открытие файла на двойной клик
Для поддержки функции открытия файла на двойной клик, необходимо выбрать для него расширение, которое желательно не занято другими приложениями, и добавить записи в реестр. А в приложении реализовать обработку параметров командной строки. Для того чтобы иконка документа имела свой вид, необходимо добавить в ресурсы самого приложения иконку, на которую можно будет сослаться.
Файл приложения
Для внесения в заглушку тестовых данных, которые были сгенерированы с помощью отчета из базы данных ЛОЦМАН:PLM, они были помещены в файл с расширением .lpf. Данные внутри файла представляют собой JSON массив объектов.
Добавление записи в реестр
Обычно все действия, связанные с добавлением записей в реестр Windows, прописываются в установщике приложения. Однако возможен и вариант создания REG-файла, который нужно было импортировать вручную. При составлении параметров записи важно учитывать, для какого пользователя вносятся изменения: если запись добавляется только для текущего пользователя, то используется ветка HKCU (HKEY_CURRENT_USER). Если же требуется реализация изменений для всех пользователей системы, то необходимо работать с веткой HKLM (HKEY_LOCAL_MACHINE), но это требует административных прав.
В установщиках приложений для указания пути до приложения обычно используются макросы, а в файле REG приходится указать полный путь до приложения заранее. В приведённом ниже примере предполагается, что приложение будет расположено в папке C:\tmp\loo_plug\
, а иконка для файла будет браться из ресурса 1
.
Пример добавления записей в реестр:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\.lpf]
@="loo_plug_file"
[HKEY_CURRENT_USER\Software\Classes\loo_plug_file]
@=""
"EditFlags"=dword:00000000
"BrowserFlags"=dword:00000008
[HKEY_CURRENT_USER\Software\Classes\loo_plug_file\DefaultIcon]
@="\"C:\\tmp\\loo_plug\\loo_lpug.exe\",1"
[HKEY_CURRENT_USER\Software\Classes\loo_plug_file\shell]
[HKEY_CURRENT_USER\Software\Classes\loo_plug_file\shell\open]
@=""
[HKEY_CURRENT_USER\Software\Classes\loo_plug_file\shell\open\command]
@="\"C:\\tmp\\loo_plug\\loo_lpug.exe\" \"%1\""
Обработка передаваемых параметров командной строки
После внесения записи в реестр при двойном клике на файле с расширением .lpf система Windows будет запускать наше приложение и передавать путь к этому файлу в качестве аргумента командной строки. Поэтому необходимо, чтобы приложение корректно обрабатывало параметры командной строки, которые в него передаются.
Важно учитывать, что помимо пути к файлу могут передаваться и другие параметры с аргументами. Например, путь к файлу может быть не первым, а вторым или даже третьим аргументом. По этой причине при обработке параметров желательно анализировать их последовательно и выбирать тот, который соответствует нужному критерию — в нашем случае, заканчивается на «.lpf«.
В заглушке я включил обработку передаваемых параметров командной строки в процедуру, которая назначена на создание главной формы OnFormCreate
.
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
param: string;
begin
for i := 1 to ParamCount do
begin
param := ParamStr(i);
if LowerCase(ExtractFileExt(param)) = '.lpf' then
begin
// Найден параметр с расширением .lpf
// Выполняется загрузка данных ...
end;
end;
end;
Открытие файла перетаскиванием
Открытие файла перетаскиванием на форму в самой заглушке не реализовывалось, но реализация такой функции достаточно проста. Для этого в настройках формы необходимо включить пункт AllowDropFiles
, а далее создать функцию обработчика событий OnDropFiles
. В функцию будет передан массив строк с путями до файлов, которые были перенесены на форму приложения. После фильтрации их можно передавать в функцию загрузки данных из файла.
Поддержка открытия ссылки собственного протокола
Для того чтобы обрабатывать собственный протокол, как и в случае с ассоциацией типа файла, необходимо внести записи в реестр. Для обработки протокола ASK приложением заглушкой, которое будет находиться по пути C:\tmp\loo_plug\
, необходимо добавить в реестр следующие записи:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\ask]
"URL Protocol"=""
[HKEY_CURRENT_USER\Software\Classes\ask\DefaultIcon]
@="C:\\tmp\\loo_plug\\loo_lpug.exe,0"
[HKEY_CURRENT_USER\Software\Classes\ask\Shell]
[HKEY_CURRENT_USER\Software\Classes\ask\Shell\Open]
[HKEY_CURRENT_USER\Software\Classes\ask\Shell\Open\Command]
@="\"C:\\tmp\\loo_plug\\loo_lpug.exe\" \"%1\""
Поскольку ранее мы реализовали обработку только аргументов, оканчивающихся на «.lpf«, теперь необходимо добавить поддержку строк, начинающихся с «ask:«, и передавать такие строки в функцию, которая вернёт ИД объекта.
Пример кода функции, для сборки нужно включить в uses модуль base64
function ExtractAndDecode(const input: string; out ObjectID: Integer; out DatabaseName: string): Boolean;
var
paramsStart, paramsEnd: Integer;
paramsValue, decodedString: string;
elements: TStringArray;
begin
ObjectID := 0;
DatabaseName := '';
paramsStart := Pos('params=', input);
if paramsStart = 0 then Exit(False);
paramsStart := paramsStart + Length('params=');
paramsEnd := Length(input);
paramsValue := Copy(input, paramsStart, paramsEnd - paramsStart + 1);
decodedString := DecodeStringBase64(paramsValue);
if decodedString = '' then Exit(False);
elements := decodedString.Split(['|']);
if Length(elements) < 4 then Exit(False);
DatabaseName := elements[1];
try
ObjectID := StrToInt(elements[3]);
except
Exit(False);
end;
result:=True;
end;
Чтобы для каждой новой ссылки не запускался свой экземпляр приложения, нужно организовать передачу информации от вновь запускаемого дубликата в уже запущенное приложение. Такой вариант можно реализовать, используя связку Mutex и Named Pipes, но об этом расскажу в следуюoщей статье.
Создание ярлыка со ссылкой «вытягиванием» объекта
В Lazarus, к сожалению, отсутствует встроенная поддержка простого механизма «вытягивания» объектов за пределы формы, аналогичного механизму перетаскивания файлов из системы на форму. Однако для упрощения этой задачи, можно использовать модуль uShellDragDrop, который предоставляет готовые функции для реализации как вытягивания объектов за пределы формы, так и копирования их в буфер обмена.
Модуль был найден на форуме Lazarus в ветке, где участник форума под псевдонимом ASerge, представил этот модуль в ответ на запрос другого пользователя, желающего реализовать перетаскивание файлов из приложения Lazarus в другие программы, поддерживающие WM_DROPFILES.
Основная идея состоит в следующем:
-
На основе данных приложения создается временный файл.
-
С помощью функции DragandDropCopyComplete из модуля uShellDragDrop.pp этот файл передается в целевую директорию.
Файл, который мы создаём, представляет собой обычный INI-файл с расширением .URL, содержащий ссылку на нужный ресурс или действие. Пример содержимого такого файла:
[InternetShortcut]
URL=ask:Loodsman.URL?Action=Navigate,params=MHxBS19QbG0wMXwyODk4fDEwMTI=
IconIndex=1
IconFile=C:\tmp\loo_plug\loo_lpug.exe
Что записано внутри файла:
-
URL указывает на специальный протокол ask:, который будет обработан соответствующим приложением.
-
IconFile задаёт путь к иконке, которая будет использоваться для ярлыка.
После выполнения функции DragandDropCopyComplete, в целевой директории появится копия временного .URL-файла — полноценный ярлык. При его запуске будет автоматически вызвано приложение, ответственное за обработку протокола ask:
.
Заключение
Надеюсь, приведенные выше примеры пригодятся вам для понимания того, как организовать взаимодействие между пользователем, системой и вашим приложением. А в следующем материале я продолжу эту тему и расскажу, как организовать передачу данных между экземплярами приложения с помощью Mutex и Named Pipes, чтобы избежать запуска дублирующихся копий клиента и обеспечить «бесшовную» обработку новых запросов.
1. Обмен данными в приложениях Windows
2. КРАТКАЯ ХАРАКТЕРИСТИКА ОПЕРАЦИОННОЙ СИСТЕМЫ WINDOWS
Рассмотрим самую распространенную в наши дни операционную систему Windows.
Windows — это популярная, хорошо защищенная многозадачная операционная система персонального компьютера с
графическим пользовательским интерфейсом.
Операционная система обеспечивает эффективную работу в системах мультимедиа и в информационно-вычислительных сетях
(в том числе и в Интернете), электронную почтовую связь.
При работе в Windows можно использовать длинные, достаточно информативные имена файлов, в которых допускаются даже
пробелы; перемещать любые объекты в любое место экрана и в любом месте экрана, вызывать контекстное меню или получать
контекстную справку.
Отличительными чертами этой операционной системы являются:
1)встроенная сетевая поддержка,—в отличие от других ОС, Windows изначально создавалась с учетом работы в вычислительной
сети, поэтому в интерфейс пользователя встроены функции совместного использования сетевых файлов, устройств и объектов;
2)приоритетная многозадачность, позволяющая приложениям с более высоким приоритетом вытеснять менее приоритетные
приложения, что приводит, в частности, к более эффективному использованию машинного времени ввиду автоматической
ликвидации зависания системы при выполнении «сбойного» приложения;
3)присутствие достаточно мощных средств защиты файлов различных пользователей от несанкционированного доступа; наличие
многоуровневого доступа к ресурсам с назначением пользователям уровня доступа в соответствии с их компетенцией;
4)поддержка нескольких файловых систем — кроме файловой системы FAT, понимаемой всеми версиями Windows имеет
собственную файловую систему (NTFS);
5)поддержка широкого спектра компьютерных платформ, в том числе и мультипроцессорных вычислительных систем.
3. ПРИЛОЖЕНИЯ WINDOWS
Windows — включает ряд вспомогательных программ,
называемых стандартными, которые позволяют удовлетворить
многие потребности пользователя. К ним относятся: редактор
текста Блокнот и более сложный — WordPad, графический
редактор Paint, программа Калькулятор, а также другие
полезные утилиты.
Калькулятор — это простая, но полезная программа, которую
можно использовать так же, как карманный калькулятор. Она
имеет два режима работы: обычный (standard) калькулятор и
инженерный (scientific) калькулятор (Рис. 1). Обычный
калькулятор выполняет четыре арифметических
действия.Инженерный калькулятор может также вычислять
тригонометрические и логические функции, а также
переводить числа и углы в разные системы счисления и
выполнять другие операции
4. Обычные инженерные калькуляторы
5. Чтобы запустить калькулятор, выберите в меню «Пуск» пункты «Программы», «Стандартные» (Accessories), затем «Калькулятор»
Чтобы запустить калькулятор, выберите в меню «Пуск» пункты «Программы»,
«Стандартные» (Accessories), затем «Калькулятор» (Calculator).
6. Блокнот
Простейший текстовый редактор, в котором
можно создать текстовый документ,
запомнить его в файле и распечатать.
Блокнот имеет резко ограниченные
возможности обработки текста и хранения
больших текстовых документов. Это
записная книжка, ориентированная на
заметки, записки, справки небольшого
размера. Окно программы Блокнот имеет
строку меню, состоящую из разделов
«Файл», «Правка», «Поиск», «Справка».
Чтобы запустить Блокнот, выберите в меню «Пуск» пункты «Программы»,
«Стандартные», затем «Блокнот» (Notepad). Сразу после запуска программа готова к
работе. По умолчанию в Блокноте используется стандартный системный шрифт. Из
меню Правка можно настроить программу на работу с другим шрифтом. В этом же
меню находится очень важная функция «Перенос по словам», которая позволяет
переносить текст автоматически, когда заканчивается строка. Если данная функция
отключена, строка имеет 255 символов. Общий объем информации, поддерживаемый
редактором, составляет около 7 кб. Информация сохраняется в файлах текстового
формата (*.txt), или с таким расширением, которое задаст пользователь. Редактор
очень удобен для выполнения системных операций с файлами настройки системы.
7. Текстовый редактор WordPad
В числе стандартных программ
Windows имеется текстовый редактор
WordPad. Он может создавать простые
текстовые документы (ASCII-файлы) и
файлы, содержащие символьное и
абзацное форматирование, а также
открывать и сохранять документы в
нескольких форматах.
8. Текстовый редактор WordPad
Хотя WordPad не имеет столь широких возможностей, как, например, Word для Windows, он может быть
использован вместо текстовых редакторов среднего уровня. WordPad является хорошим инструментом
для написания заметок, писем, отчетов и других текстовых документов.
Это единственная программа, которая открывает текстовые файлы, подготовленные в ДОС с
использованием альтернативной русской кодировки.
Для запуска WordPad выберите в меню «Пуск» (Start) пункты «Программы» (Programs), «Стандартные»
(Accessories), затем WordPad.
Чтобы создать новый документ, наберите в окне редактора нужный текст, а затем сохраните его под
желаемым именем. При вводе текста избегайте использовать пробелы для размещения отдельных
элементов текста, например формирования абзацных отступов. Для этой цели следует использовать
параметры абзаца, которые можно открыть, выбрав из меню команды «Формат» (Format), «Абзац»
(Paragraph).
WordPad может открывать файлы, записанные в разных форматах. Для каждого из этих форматов
можно установить режим переноса слов (параметры вкладки «Внедренный объект» (Embedded)
применяются при редактировании текста, вставленного в другой документ). Для этого выберите из
меню команды «Вид» (View), затем «Параметры» (Options). При этом WordPad выведет на экран
диалоговое окно «Параметры». Щелкните на вкладке используемого вами формата и установите один
из трех переключателей в группе «Перенос по словам» (Word wrap):
«Не производится» (No wrap). В этом режиме WordPad не переносит текст на новую строку при
достижении края окна или правого поля (если оно установлено). Если продолжать набирать текст, окно
смещается вправо.
«В границах окна» (Wrap to window). Этот режим вызывает перенос текста на следующую строку, когда
конец текущей строки достигает края окна. Изменение размеров окна влияет на длину каждой строки
текста.
«В границах полей» (Wrap to ruler). Этот режим заставляет WordPad переносить текст на новую строку по
достижении им правого поля независимо от размеров окна.
9. Графический редактор Paint
• Paint позволяет
создавать или
редактировать
файлы растровых
рисунков в
формате BMP.
Формат файла
BMP является
стандартным
растровым
форматом
файлов Windows.
10. Графический редактор Paint
Можно использовать Paint для создания и редактирования растровых файлов
документов, изменения заставок Windows — и в других целях. Для обработки
фотографических изображений лучше использовать более сложные
графические редакторы, например: Photoshop, Photoeditor.
Для запуска Paint щелкните на кнопке «Пуск» (Start), затем выберите из меню
пункты «Программы» (Programs), «Стандартные» (Accessories) и Paint. Теперь
можете приступать к рисованию. В программе имеется довольно богатый
набор инструментов.
Щелкните на инструменте, который вы хотите использовать, переведите
мышь в область рисования и начинайте рисовать. При нажатой левой кнопке
мыши инструмент оставляет след основного цвета, при нажатой правой
кнопке — цвета фона. Изменить основной цвет и цвет фона можно, щелкнув,
соответственно, левой или правой кнопкой мыши на нужном цвете в палитре,
расположенной в нижней части экрана. Закончив рисунок, сохраните его.
Если допущена ошибка, выберите из меню Рисунок (Image) команду
«Очистить» (Clear image), а затем начните все сначала. Можно отменить одно
или несколько последних действий, выбрав из меню «Правка» (Edit) команду
«Отмена» (Undo).
11. ОБМЕН ДАННЫМИ МЕЖДУ ПРИЛОЖЕНИЯМИ
• В состав Windows входят приложения, предназначенные для создания
документов различного характера (текстовых, табличных,
графических). Документ, разработанный в одном приложении, может
содержать фрагменты в других приложений. Таким образом,
обмениваясь данными, приложения работают совместно, создавая
составной или интегрированный документ.
• Например, в текст, созданный в приложении WordPad, можно
включить результат вычислений, выполненный в Калькуляторе, и
рисунок, нарисованный в графическом редакторе Paint. В результате
появляется составной документ, включающий данные разного типа,
созданные в других программах. Когда открывается текстовый
документ, являющийся главным, подключаются связанные с ним
объекты из других приложений.
• Обмен данными в Windows организуется одним из следующих
способов:
• 1)через буфер обмена;
• 2)с помощью технологии OLE.
12. Буфер обмена
• При обмене данными через буфер следует выделить объект,
созданный в некотором приложении, и поместить его в буфер
командой «Правка» «Вырезать» или «Правка» «Копировать». Из
буфера обмена объект можно вставить командой «Правка»,
«Вставить» в любое приложение, имеющее доступ к буферу.
Вставленный таким обратим объект становится элементом
составного документа, теряя связь с тем приложением, которое его
создало.
• Предположим, для вставки графического объекта в текстовый
документ вы использовали обмен данными через буфер. В этом
случае рисунок теряет связь с программой, которая его создала, а для
того чтобы его отредактировать, необходимо выполнить следующие
шаги:
• 1)удалить из текста старый вариант рисунка;
• 2)запустить программу, в которой создавался рисунок, открыть файл,
содержащий рисунок;
• 3)внести в рисунок изменения;
• 4)вставить рисунок в текст.
13. Обмен данными по технологии OLE
Более гибким способом обмена данными между приложениями Windows является технология
OLE (Object Linking and Embedding, связывание и внедрение объектов). Технология OLE
позволяет установить связь объекта, вставленного в документ, с приложением, которое его
создавало.
При использовании технологии OLE объект, созданный в некотором приложении, должен быть
выделен и помещен в буфер командой «Правка», «Вырезать» или «Правка», «Копировать». Для
внедрения объекта из буфера следует использовать команду «Правка», «Специальная вставка».
В этом случае устанавливается связь объекта с приложением, которое его создало.
Приложение, в котором создан внедренный объект, запускается при необходимости
редактирования двойным щелчком по объекту. Пользователь получает возможность работать
над составным документом средствами приложения, в котором создается главный документ,
и средствами приложения, в котором создан внедренный объект.
Технологию OLE рассмотрим на примере составного документа, созданного на основе текста в
приложении WordPad, в который вставлен рисунок из приложения Paint. Рисунок необходимо
отредактировать, т. е. внести в него изменения. Программа WordPad своими средствами не
может изменять данные из другой программы. В программе Paint сделанный рисунок
выделяется и копируется. В документе WordPad устанавливается указатель мыши в то место,
куда будет интегрирован рисунок, и в меню «Правка» выполняется команда «Специальная
вставка». В открывшемся диалоговом окне выбирают способ вставки «Вставить» или «Связать»
и вид объекта «рисунок». Завершается операция нажатием кнопки «ОК».
14. Основные понятия технологии OLE
• В приведенном примере — объект OLE — рисунок; сервер
OLE — программа для создания графических изображений
Paint; клиент OLE- программа для создания текстовых
документов WordPad.
• Технология OLE позволяет внедрить документ или связать
объект OLE с приложением клиента. Рассмотрим эти
варианты.
15. Внедрить документ как объект OLE
• Внедренный документ можно редактировать средствами OLE
сервера, но внесенные изменения не отражаются на исходном файле,
а только на его копии, вставленной в главный документ. В нашем
примере для редактирования рисунка выполняется двойной щелчок
по рисунку, запускается программа Paint, которая позволяет внести
изменения в рисунок, и с этими изменениями рисунок останется в
тексте, однако исходный файл рисунка сохранится без изменений.
16. Связать объект OLE с приложением клиентом
• При связывании документов в процессе редактирования исходного
файла объекта OLE изменения отражаются и в клиенте OLE, т. к.
клиент OLE содержит информацию о том, где следует искать этот
объект.
17. Презентацию сделала : Воронина Анастасия Валерьевна ГД -1501 Преподаватель : Соколовская Светлана Анатольевна
Программирование в LE-технология Microsoft Windows
Программирование в LE-технология Microsoft Windows
Предисловие
Наиболее распространенным языком программирования последнего десятилетия
безусловно является С. Этому способствовали такие его особенности, как
лаконичность, мощность, гибкость, мобильность. Вместе с тем, стремительное
усложнение приложений, для реализации которых применяются традиционные
процедурно-ориентированнные языки программирования и, в частности С, заставляют
говорить об определенном кризисе в их использовании, связанном прежде всего с
недостаточной надежностью и выразительной способностью.
Подобных недостатков во многом лишены языки объектно-ориентированнго
программирования (ООП), в сонове которыхлежит идея моделирования объектов
посредством иерархически связанных классов.
Отдельно взятый класс рассматривается как совакупность множества данных и
операций над ними, причем доступ к элементам данных класса возможен только
посредством операций этого класса. Установление четкой взаимозависимости между
данными и операциями ведет к большой целостности данных и значительно повышает
надежность программ по сравнению с традиционными языками программирования.
Кроме того, идея программирования с помощью классов во многом использует тот же
подход, который позволяет людям формировать модели объектов реального мира.
Впервые идеи ООП были реализованы в середине 60-х годов в языке
программирования Симула-67. Последний, однако, не нашел в то время широкого
распространения как в силу своей относительно меньшей производительности по
сравнению с традиционными языками типа FORTRAN, ALGOL, PL/1 так и, возможно, неадекватности предлагаемых средств решаемым в то время
задачи. Еще одним важным ограничением для распространеия Симулы-67 стали
трудности, с которыми пришлось столкнуться большинству программистов при его
изучении. Дело в том, что наряду с целым рядом безусловных достоинств, идеи ООП
обладают и одним существенным недостатком — они далеко не просты для понимания
и особенно для освоения с целью практического использования.
С++ — это объектно-ориентированыый язык, то есть язык, позволяющий
программисту оперировать объектами некоторых типов, предварительно им
определенным. Название языка «С++» отражает эволюционный характер
изменения языка С (запись «++», в языке С, означает, что к какой-то
переменной прибавляется единица). Он имеет еще более мощные и гибкие средства
для написания эффективных программ, чем С, от которого он произошел. Человек,
программмирующий на традиционных языках, может просто потерять голову от тех
возможностей, которые предоставляет С++.
Но не менее важным является то, что такой распространенный и универсальный
язык, как С, сохранен в качестве основы. С прост, эффективен, переносим. Чего
только нет в языке С: строковых данных нет, матриц нет, средств параллельного
программирования тоже нет. Нет даже ввода-вывода.
Типы, операции и операторы С очень близки к тому, с чем мы имеем дело в
Ассемблере,- числа, адреса, арифметические и логические действия, циклы…
Кроме того, многие особенности С недвусмысленно намекаю компилятору, как
сократить код и время исполнения программы. Эти характерные черты языка С
позволяют написать эффективно работающий и не слишком сложный компилятор. И
хотя в машинных кодах на разных компьютерах элементарные операции обозначаютс
по-разному, вряд ли разработчику компилятора придет в голову интерпретировать
простейшие выражения каким-нибудь оригинальным способом. Именно поэтому язык С
«идет везде и на всем», программы, написанные на нем, работают эффективно,
и их можно переносить с одного компьютера на другой.
MS Windows и новый метод
разработки программ.
Одним из наиболее важных механизмов взаимодействия программ является обмен
данными. В MS Windows существует несколько
способов взаимодействия приложений:
— почтовый ящик;
— динамический обмен данными;
— встраивание объектов.
Специальный почтовый ящик (clipboard) Windows позволяет пользователю переносить информацию из одного
приложения в другое, не заботясь об ее форматах и представлении.
В отличие от профессиональных операциональных операционных систем, где
механизм обмена данными между программами доступен только программисту, в Windows это делается очень
просто и наглядно для пользователя.
Механизм обмена данных между приложениями — жизненно важное свойство многозадачной
среды. И в настоящее время производители программного обеспечения пришли уже к
выводу, что для переноса данных из одного приложения в другое почтового ящика
уже недостаточно. Появился новый, более универсальный механизм — OLE (Object Linking and Embedding)
— Встроенная объектная связь, который позволяет переносить из одного
приложения в другое разнородные данные. Например, с помощью этого механизма
данные, подготовленные в системе Time Line for Windows (Symantec), можно переносить в текстовый процессор Just Write ( Symantec ), а затем, скажем,
в генератор приложений Object Vision (Borland). Правда, это уже
нестандартное средство Microsoft Windows, но тем не менее реализация OLE стала возможной именно в Windows.
Кроме механизма почтового ящика, предназначенного, в основном, для
пользователя, программисту в Windows доступны специальные средства обмена данными между
приложениями.
Программным путем можно установить прямую связь между задачами, например,
принимая данные из последовательного порта, автоматически помещать их, скажем,
в ячейки электронной таблицы Excel, средствами которой можно тут же отображать сложные зависимости в виде
графиков или осуществлять их обработку в реальном режиме времени (этот механизм
носит название динамического обмена данными — Dynamic Data Exchange, DDE ).
Основные термины
Клиентское приложение DDE — приложение, которому необходимо установить диалог с сервером и получить
данные от сервера в процессе диалога.
DDE-диалог — взаимосвязь
между клиентским и серверным приложениями.
Сервер-приложение — DDE приложение, которое передает данные клиенту в процессе диалога.
DDE-Транзакция -обмен
сообщениями или данными между клиентом и сервером.
Item имя — строка,
идентифицирующая некоторое множество данных, которое сервер в состоянии передать
клиенту в процессе диалога.
Service имя — строка,
генерируемая сервером и используемая клиентом для установления диалога.
Строковый указатель — двойное слово, генерируемое операционной системой,
идентифицирующее строку, передающуюся в процессе динамического обмена данными.
Topic имя — строка,
которая идентифицирует тип данных, необходимых клиентскому приложению при
динамическом обмене данных.
Фильтр транзакции — флаг, который препятствует передаче нежелательных типов
транзакций в функцию обратного вызова.
В Microsoft Windows динамический обмен
данных является формой связи, которая использует общие области памяти для
обмена данными между приложениями. Приложение может использовать DDE в некоторый момент
времени для передачи и получения новых данных от сервера.
Механизм DDE схож с механизмом
почтового ящика, который является частью операционной системы WINDOWS. Существует лишь
незначительная разница в том, что почтовый ящик, в большинстве случае,
используется как буфер временного хранения информации. DDE может быть инициализирован пользователем и в
большинстве случаев
продолжать работать без его вмешательства.
Библиотека DDEML обеспечивает
пользователя набором средств, которые упрощают использование механизма DDE в WINDOWS приложениях. Вместо
того, чтобы обрабатывать, получать и передавать DDE сообщения напрямую, приложения используют
функции DDEML библиотеки.
Библиотека DDEML также обеспечивает
работу со строками и разделяемыми данными, генерируемыми DDE приложениями. Вместо
того, чтобы использовать указатели на общие области памяти, DDE приложения создают и
обмениваются строковыми указателями, которые идентифицируют строки и данные.
Уже существующие приложения, использующие протокол DDE, основанный на сообщениях полностью
совместимы с теми, которые используют библиотеку DDEML. Вот почему приложение, использующее DDE-протокол могут
установить диалог и выполнять транзакции с приложениями, использующими
библиотеку DDEML.
Взаимосвязь между клиентом и сервером.
DDE возникает всегда
между клиентским приложением и серверным. Клиентское приложение инициализирует
обмен данными путем установления диалога с сервером и передачи транзакции.
Транзакция необходима для данных и обслуживания. Сервер отвечает на транзакцию
и обеспечивает клиента данными. Сервер может иметь сразу несколько клиентов в
одно и тоже время, в свою очередь, клиент может получать данные сразу от
нескольких серверов. Некоторое приложение одновременно может быть и клиентом и
сервером. В добавок к вышесказанному, клиент и сервер могут оборвать диалог в
любое удобное для них время.
DDE сервер использует
три зарезервированных типа имен, расположенных иерархично: service, topic item — уникально
идентифицируют некоторое множество данных, которое сервер может передать
клиенту в процессе диалога.
Service имя — это строка,
которую генерирует сервер в те промежутки времени, в которые клиент может
установить диалог с сервером.
Topic имя — это строка,
которая идентифицирует логический контекст данных. Для сервера, который
манипулирует файлами, topic имена это просто названия файлов; для других серверов – это специфические
имена конкретного приложения. Клиент обязательно должен указывать topic имя вместе с service именем, когда он
хочет установить диалог с сервером.
Item имя — это строка,
которая идентифицирует некоторое множество данных, которое сервер может
передать клиенту в процессе транзакции. Например, item имя может идентифицировать ЦЕЛОЕ ( int, integer ), СТРОКУ ( string, char * ), несколько
параграфов текста, или BITMAP образ.
Все вышеуказанные имена позволяют клиенту установить диалог с сервером и
получить от него данные.
Системный режим
Системный режим работы обеспечивает клиента всей необходимой информацией о
сервере.
Для того, чтобы определить, какие серверы доступны в данный момент времени,
а также какой информацией они могут обеспечить клиента, последний, находясь в
начальном режиме работы, должен установить имя устройства, равное NULL. Такой шаблон
диалога максимально увеличивает эффективность работы, а также работу с сервером
в системном режиме. Сервер, в свою очередь, должен поддерживать нижеописанные item имена, а также
другие, часто используемые клиентом:
SZDDESYS ITEM TOPICS — список item имен, с которыми
может работать сервер в данный момент времени. Этот список может изменяться
время от времени.
SZDDESYS ITEM SYSITEMS — список item имен, с которыми
может работать сервер в системном режиме.
SZDDDESYS ITEM STATUS — запросить текущий
статус сервера. Обычно, данный запрос поддерживается только в формате CF_TEXT и содержит строку
типа Готов/Занят.
SZDDE ITEM ITEMLIST — список item имен, поддерживаемых
сервером в несистемном режиме работы. Этот список может меняться время от
времени.
SZDDESYS ITEM FORMATS — список строк,
представляющий собой список всех форматов почтового ящика, поддерживаемых
сервером в данном диалоге. Например, CF_TEXT формат представлен строкой TEXT.
Основное назначение и работа функции обратного вызова
Приложение, которое использует DDEML, должно содержать функцию обратного вызова, которая
обрабатывает события, полученные приложением. DDEML уведомляет приложение о таких событиях путем
посылки транзакций в функцию обратного вызова данного приложения.
В зависимости от флага фильтра транзакции, сформированного при вызове
функции DdeInitialize, функция обратного
вызова получает отсортированные транзакции вне зависимости от того, является ли
данное приложение клиентом, сервером или тем и другим одновременно.
Параметр uType идентифицирует тип
посланной транзакции в функцию обратного вызова при помощи DDEML. Значения оставшихся
параметров зависят от типов транзакции. Типы транзакций будут обсуждены нами в
разделе «Обработка Транзакций».
Диалог между приложениями
Диалог между клиентом и сервером всегда устанавливается по требованию
клиента. Когда диалог установлен, оба партнера получают идентификатор, который
описывает данный диалог.
Партнеры используют этот идентификатор в большинстве функций DDEML для посылки
транзакций и для их обработки. Клиенту может потребоваться диалог как с одним
сервером, так и с несколькими.
Рассмотрим подробно как приложение устанавливает диалог и получает
информацию о уже существующих каналах связи.
Простой Диалог
Клиентское приложение устанавливает простой диалог с сервером путем вызова
функции DdeConnect и определяет
идентификаторы строк, которые содержат всю необходимую информацию о service имени текущего
сервера и интересущем клиента в данный момент topic имени.
DDEML отвечает на вызов
этой функции посылкой соответствующей транзакции XTYP_CONNECT в функцию обратного вызова каждого доступного в данный
момент времени сервера, зарегистрированное имя которого совпадает с именем,
переданным при помощи функции DdeConnect при условии, что сервер не отключал фильтр service имени вызовом
функции DdeServiceName.
Сервер может также установить фильтр на XTYP_CONNECT транзакцию заданием соответствующего флага CBF_FAIL_CONNECTIONS при вызове функции DdeInitialize.
В процессе обработки транзакции типа XTYP_CONNECT DDEML передает полученные от клиента service и topic имена серверу. Сервер должен проверить эти имена и
возвратить TRUE, если он в состоянии
работать с такими именами, и FALSE в противном случае. Если ни один из существующих серверов не отвечает на CONNECT-запрос клиента,
функция DDeConnect возвращает ему NULL с информацией о том,
что в данный момент времени НЕ возможно установить диалог.
Однако, если сервер возвратил TRUE, то диалог был успешно установлен и клиент получает
идентификатор диалога — двойное слово, посредством которого и ведется обмен
данными с сервером.
Затем сервер получает транзакцию вида XTYP_CONNECT_CONFIRM (в случае, если он НЕ описывал флаг фильтра CBF_FAIL_CONFIRMS при вызове
соответствующей функции).
Если сервер возвращает TRUE в ответ на транзакцию XTYP_CONNECT, DDEML посылает транзакцию
вида XTYP_CONNECT_CONFIRM в функцию обратного
вызова данного сервера. Обработав эту транзакцию, сервер может получить
идендификатор диалога.
Вместо конкретного имени сервера клиент может установить шаблон диалога
путем установки идентификаторов service и topic имен в NULL при вызове функции DdeConnect.
Если хотя бы один из вышеперечисленных идентификаторов равен NULL, DDEML посылает транзакцию
типа XTYP_WILDCONNECT в функцию обратного
вызова всех активных в данный момент DDE-приложений (исключения составляют лишь те, кто при
вызове соответствующей функции указал флаг фильтрации XTYP_WILDCONNECT).
Любое сервер-приложение должно ответить на данную транзакцию и возвратить
указатель на массив структур типа HSZPAIR, оканчивающийся нулем.
Если сервер-приложение НЕ вызывает функцию DDeNameService для регистрации
собственного service имени в системе и
фильтр обработки транзакций включен, то сервер НЕ получит транзакцию вида XTYP_WILDCONNECT.
Вышеописанный массив должен содержать одну структуру для каждого service и topic имен. DDEML выбирает одну пару
из массива для установления диалога и возвращает его идентификатор клиенту.
Затем DDEML посылает серверу
транзакцию вида XTYP_CONNECT_CONFIRM (исключения
составляют лишь те серверы, которые при инициализации установили фильтр
обработки транзакций).
Любой сервер или клиент может оборвать диалог в любое время путем вызова
функции DdeDisconnect. Это означает, что
партнер по обмену данными получает транзакцию типа XTYP_DISCONNECT в функции обратного вызова (если, конечно, партнер не
установил фильтр обработки транзакций вида CBF_SKIP_DISCONNECTIONS).
Обычно приложение реагирует на транзакцию XTYP_DISCONNECT вызовом функции DdeQueryInfo для получения информации о
прекращенном диалоге. После того, как функция обратного вызова обработала
транзакцию типа XTYP_DISCONNECT, идентификатор
диалога больше не существует.
Клиентское приложение, которое получает транзакцию типа XTYP_DISCONNECT в своей функции
обратного вызова может попытаться возобновить диалог при помощи вызова функции DdeReconnect. Клиентское
приложение может вызывать эту функцию только находясь внутри своей собственной
функции обратного вызова.
Сложный диалог
Клиентское приложение может использовать функцию DdeConnectList для того, чтобы
определить какие сервер-приложения существуют в системе в данный момент
времени.
Клиент обязательно должен описывать service и topic имена, когда он вызывает эту функцию; это означает, что DDEML должна послать
транзакцию вида XTYP_CONNECT все функции
обратного вызова всех имеющихся в данный момент сервер-приложений, чьи
зарегистрированные имена совпадают с именами, указанными клиентом (исключение
составляют лишь те серверы, которые фильтруют получаемые транзакции).
В добавление к вышесказанному, можно отметить, что клиент, при вызове
функции DdeConnectList, может указать NULL в качестве service или topic имени, либо же сразу
для обоих. Все доступные в системе серверы, чьи зарегистрированные имена
совпадают с именами, указанными клиентом, отвечают на его запрос. Диалог
устанавливается со всеми такими серверами, даже если в системе запущено одно и
тоже сервер-приложение несколько раз.
Клиент может использовать функции DdeQueryNextServer и DdeQueryConvInfo для того, чтобы понять, какой сервер
находится в списке, полученный при вызове функции DdeConnectList. DdeQueryNextServer возвращает
идентификатор диалога для следующего сервера, находящегося в списке; DdeQueryConvInfo заполняет структуру CONVINFO информацией о
диалоге.
Клиент может сохранить полученные идентификаторы диалогов и отказаться от
просмотра оставшихся серверов в списке.
Приложение может оборвать индивидуальный диалог, находящийся в списке
диалогов путем вызова функции DdeDisconnect; приложение может оборвать все диалоги, находящиеся в
списке путем вызова функции DdeDisconnectList.
Обе вышеуказанные функции указывают DDEML о необходимости посылки транзакции вида XTYP_DISCONNECT во все функции
партнеров по диалогу данного приложения (в случае использования функции DdeDisconnectList будет посылаться
транзакция XTYP_DISCONNECT для каждого элемента
в списке диалогов).
Обмен данными между приложениями
Так как DDE использует области
памяти для передачи данных из одного приложения в другое, DDEML обеспечивает
конечного программиста функциями, при помощи которых DDE-приложения могут создавать и обрабатывать DDE-объекты.
Весь спектр транзакций, который вызывает обмен данными, требует от
приложения, экспортирующего их, создания некоторого буфера, содержащего эти
данные, а затем вызова функции DdeCreateDataHandle.
Эта функция создает DDE-объект, копирует данные из буфера в этот объект и возвращает идентификатор
данных для данного приложения.
Идентификатор данных-это двойное слово, которое использует DDEML для обеспечения
доступа к данным в DDE-объекте.
Для того, чтобы разделять данные в DDE-объекте, приложение передает идентификатор
данных DDEML, а затем DDEML передает его в
функцию обратного вызова приложения, получающего данные.
Клиентское приложение получает указатель на DDE-объект путем передачи идентификатора данных
функции DdeAccessData. Указатель,
возвращаемый этой функцией, обеспечивает доступ к данным в формате ‘ТОЛЬКО НА
ЧТЕНИЕ’. Клиент должен просмотреть полученные данные при помощи этого указателя
и вызвать функцию DdeUnaccessData для его уничтожения.
Клиент может скопировать полученные данные в заранее приготовленный буфер
посредством вызова функции DdeGetData.
Обычно, когда приложение, создающее идентификатор данных, передает его DDEML, этот идентификатор
портится внутри вышеуказанного приложения. В этом нет ничего страшного, если
сервер должен разделять данные только с одним клиентом. Если же сервер должен
разделять данные сразу с несколькими клиентами одновременно, ему придется
указывать флаг HDATA_APPOWNED при вызове функции DdeCreateDataHandle.
Это делает возможным получение прав собственности на DDE-объект
сервер-приложения и предотвращает порчу идентификатора данных DDEML. Приложение может
передавать DDEML идентификатор данных
любое количество раз, однако вызывать функцию DdeCreateDataHandle можно лишь однажды.
Если приложение указывает флаг HDATA_APPOWNED в параметре atCmd при вызове функции DdeCreateDataHandle, оно обязательно
должно вызывать функцию DdeFreeDataHandle для очистки памяти вне зависимости от того, передавался
ли идентификатор данных DDEML или нет. Перед тем как оборвать диалог, приложение должно вызывать функцию
DdeFreeDataHandle для очистки всех
созданных идентификаторов, но которые так и не были переданы DDEML.
Если приложение еще не передало идентификатор DDE-объекта DDEML, то оно может добавить данные к уже
существующему объекту или полностью заменить их в нем. Все эти сервисные
функции обслуживаются функцией DdeAddData.
Обычно приложение использует эту функцию для новой инициализации старых не
уничтоженных DDE-объектов. После
того, как приложение передает идентификатор данных DDEML, DDE-объект, идентифицирующий этот идентификатор НЕ может
быть изменен, однако он может быть уничтожен.
OLE-технология
Как видно из описанного выше протокола DDE, приложения должны обязательно знать типы
передаваемых данных, уметь их обрабатывать, а в основном даже могут работать
только с символьными строками. Это, конечно, не очень удобно, когда необходимо,
например, создать небольшой текст с различными картинками, пиктограммами и
другими наглядными или не очень иллюстрациями. В этом случае на помощь
программисту приходит OLE — встраивание объектов.
Вместе с данными мы получаем машинный код, который эти данные может
обрабатывать.
Способы упорядочивания, источники и целевые документы
При использовании OLE-технологии пользователь всегда имеет дело с одним ведущим приложением
(главным) и одним ведомым (подчиненным), а точнее, с одним ведомым.
Приложение, с помощью которого получен объект для встраивания всегда играет
роль подчиненного. Это особенно характерно для случаев передачи объектов при
встраивании и связывании через буфер промежуточного обмена.
Часто используемые термины Приложение-источник и Целевое приложение
касаются не подчинения приложений, а определяют генеалогию объектов.
Некоторые Windows-приложения могут
выступать только в роли подчиненных, а некоторые только в роли ведущих.
Например, Paintbrush в OLE технологии может
играть только роль подчиненного приложения, служащего для создания и
модификации отдельных объектов. Другие приложения, например, Write или Cardfile можно считать
оправданным с точки зрения, что гораздо чаще приходится вставлять иллюстрации в
сложные по структуре текст, чем текст в иллюстрации. Новые приложения, такие
как Word, могут выполнять в
рамках OLE обе эти функции.
Употребление термина объект считается престижным в кругах программистов,
хотя часто он употребляется и не к месту. Всякий разработчик почитает своим
долгом применить в своем продукте ООП без особой на то необходимости. В среде Windows в термин объект
вкладывается несколько специфический смысл. Пользователя не приглашают
постигать азы ООП, или заняться конструированием объектов на С++.
Когда об объектах говорят в рамках Windows, то имеют в виду возможность встраивания в
некоторый документ фрагмента, порожденного другим приложением. Вот это
«инородное тело» и называется объектом.
В таком подходе нет ничего нового. Когда в текст, подготавливаемый Write, вставляется рисунок
из Paintbrush посредством Clipboard или таблиц Exсel, в документ,
подготавливаемый в Word, то результатом
действия будет как раз появления объекта.
Традиционные объекты всегда представляют собой копии. Работа с ними
основывается на том, что все Windows приложения поддерживают не только свой собственный
формат, но и некоторый обобщенный, стандартный, играющий роль общеизвестного
международного языка. Если, например, в текстовый документ вставляется таблица
из табличного процессора, то буфер промежуточного обмена преобразует ее в
формат к стандартному, и тем самым обеспечивает вставку. Такая копия в
текстовом редакторе по виду не отличается от оригиналу, но она недоступна для
внесения изменений. Невозможно, вставив таким способом копию из Paintbrush в Write документ, изменить
цвет, толщину линий или масштаб.
Новые объекты, доступные в рамках Windows 3.1 очень похожи на традиционные, но они не являются
копиями — это оригиналы. Они имеются в единственном экземпляре и находятся
непостредственно в целевых документах. Там они существуют одновременно в двух
форматах — в стандартном и в формате приложения-источника.
Благодаря стандартному формату объект может индицироваться и сохранять в
рамках целевого документа. Имеется возможность обработки объекта также, как и
любого файла оригинала. Ситуация выглядит так, словно внутри объекта встроен
другой. Это обеспечивает доступ к средствам обработки нового объекта
(приложению-источнику) посредством простого двойного щелчка на объекте.
Встроенные объекты
Информация, вставленная в документ целевого приложения, представляет собой
объект. Такой объект встраивается в документ, обрабатываемый ведущим
приложением. Это значит, что он рассматривается как составная часть данного
документа, может распечатываться и сохраняться вместе с ним. Такие объекты
могут содержать информацию любого типа: текст, таблицы, графики и др.
Встроенные объекты существуют только в единственном экземпляре и только
там, где они встроены — в целевом документе. Обрабатываются они своими
«родительскими» программами, вызываемыми весьма эффективным способом,
в отличие от традиционного.
Связывание с родительским приложением
Следующей весьма удобной особенностью встроенных объектов является то, что
они остаются связанными с породившим их приложениями. Благодаря этому
пользователь избавляется от необходимости помнить имена и директории
файлов-источников. Достаточно двойного щелчка на объекте — и родительская
программа запускается.
Важным достоинством подобного связывания встроенных объектов является
мобильность документов. Можно легко перенести такой документ с одной машины на
другую (необходимо только чтобы на них обеих была установлена оболочка и были
необходимые приложения или динамические библиотеки от них). Для обработки
встроенных объектов достаточно будет щелкнуть по ней дважды и на другой машине
произойдет тоже самое, что и на вашей: вызовется соответствующее приложение. В
этом случае необходимым условием переноса является наличие на другой машине
текстового редактора Write и графического редактора Paintbrush.
При работе в рамках DDE такой перенос не возможен, точнее он будет включать в себя не только
перенос самого файла-документа, но и связанных с данным файлом
файлов-источников и целевых файлов — всей структуры.
Перспективы развития OLE
Технология OLE делает только первые
шаги. Пока только некоторые Windows приложения являются OLE совместимыми. Среди утилит группы Accessories версии 3.1 такими на
сегодняшний день являются только Write, Paintbrush и Cardfile. Но даже они «в
своем кругу» не допускают вставки в произвольном направлении (т.е. из
любой в любую другую). В настающее время речь идет о поддержке наиболее
оправданного с практической точки зрения «направления встраивания» —
из Paintbrush в Write и Сardfile документа.
Чтобы определить какие из приложений поддерживаю OLE интерфейс, необходимо из OLE-совместимого
приложения выполнить директиву «ВСТАВИТЬ ОБЪЕКТ» в меню «Edit». В отрывшемся
окне будет продемонстрирован список доступных встраиваемых объектов.
В настоящий момент многие компиляторы уже ввели поддержку OLE в свои библиотеки: Borland C++ ver4.5. Пример использования OLE технологии приведен
в приложении 1. Данная программа использует созданный рисунок Paintbrush в виде файла или
копирует его из Clipboard.
Заключение
В заключении хотелось бы отметить, что существующие способы обмена
информации возникали вместе с развитием Windows. Как сама суть Windows, они являются продолжением заложенной в нее
цель: cспособность работать
с файлами любых форматов, на любом оборудовании. В отличие от стандартного
решения, когда фирма-производитель оболочки (типа Windows) пыталась сама написать различные драйверы
для поддержки устройств и различные библиотеки для поддержки форматов
многочисленных файлов других пакетов, фирма Microsoft возложила эту обязанность на
производителей оборудования и программного обеспечения. Таким образом,
последовательное развитие Clipboard—>DDE—>OLE является
продолжением воплощения идеи «сам изобрел — сам внедряй».
Естесственно, наибольшие надежды сейчас возлагаются на OLE (ее новый стандарт OLE.2), так как этот стандарт позволяет включать
в себя очень мощные средства, такие как Multimedia. В одном файле может находится не
только текст, рисунок, а и даже целый фильм, полностью озвученный и готовый к
показу.
Список литературы
1. Гладков С.А. Фролов Г.В. Программирование в Microsoft Windows: В 2-х частях.
М.:»ДИАЛОГ-МИФИ», 1992.
2. Фойц С. Windows 3.1 для
пользователя. Пер. с немецкого Киев:BHV, 1992.
3.
Microsoft Windows Software Development Kit. Version 3. Programmer’s Reference,
Programming Tools, Windows Extensions.
4.
Charles Petzold. Programming Windows. Microsoft Press.
5 Borland C++.
Usres manual.
Сообщение было отмечено как решение
Решение
Ну раз уж подняли старую тему…
В Windows самый эффективный механизм обмена данными между приложениями — это
разделяемая память (или отображаемые в память файлы, это почти одно и то же), а
также все механизмы, построенные на этой основе (pipes, например). Разделяемая
память поддерживается аппаратно (отображение одной физической страницы на разные
виртуальные адреса), для обмена данными не требуется ни доступ к диску/сети,
ни смена задач, ни переключение в ядро, поэтому скорость максимальная.
У Memory-Mapped Files есть лишь один недостаток — для обмена данными между
сессиями нужно создавать объект MMF в глобальном пространстве имен, а для этого
нужна привилегия SE_CREATE_GLOBAL_NAME, которая, начиная с Windows Vista,
только у администраторов и служб.
У именованных каналов (named pipes) такой проблемы нет, к тому же они поддерживают
обмен данными по сети, работу с безопасностью (например, пайп-сервер может выполнять
запрос в контексте безопасности пайп-клиента), message mode, таймауты и кое-что еще.
Правда, написать хорошо работающий пайп-сервер не так просто, как кажется, но такова
цена за его эффективность и функциональность. IpcChannel и NetNamedPipeBinding из WCF
тоже построены на pipes, так что в .NET, вероятно, стоит использовать их.
Еше один вариант — COM/RPC.
Скорость здесь будет ниже на порядок, да и для тех, кто не знаком с технологией COM,
написание даже простейшего клиент-сервера может быстро завести в тупик. Но это один из
немногих способов работать с данными в объектном ключе (классы, свойства, методы,
интерфейсы) и вызывать удаленные (в том числе на удаленных машинах) методы так, как
будто они находятся в одном и том же процессе. К тому же COM поддерживается очень
многими средами, это большой плюс. Про компоненты, которые пишутся на C++, а затем
дергаются из JScript или .NET, или используются в Office/1C, рассказывать не буду.
Если ничто из вышеперечисленного использовать нельзя (или не позволяет «религия»),
тогда остаются сокеты. Но это не самое лучшее решение. В двух словах — long path.
Даже простейший вызов send, recv или connect на локалхост проходит длинную цепочку
вызовов, от уровня winsock вниз, через провайдеров сети, затем в ядро (AFD), потом в
стек TCP, где для него создаются I/O-запросы, выполняются ожидания, доставка APC и
прочее-прочее. И только пройдя этот «лабиринт» вызовов и часовых механизмов, данные
попадают в ожидающее приложение. Если на компьютере установлен какой-нибудь фаервол и
он настроен на фильтрацию локальных соединений (а такая опция есть у многих из них),
то картина будет еще более запутанной, а путь — еще более длинным.
Что касается WM_COPYDATA, то это вообще последний вариант, когда ничего другого не
остается. Здесь нет гарантии доставки, нет возможности отправить данные в ответ.
Для обработки нужна оконная процедура. Сами сообщения летают только в пределах одного
десктопа, а на Windows Vista и выше «режутся» UAC-ом, например если их пытаются слать
от обычного процесса к процессу, запущенному в контексте администратора. А если
разрешить доставку (ChangeWindowMessageFilter), то всякое зловредное приложение
сможет делать то же самое. В общем, это и ненадежно, и неудобно, и несекьюрно.
11
С первых дней существования
компьютеров обозначились трудности,
связанные с переносом данных между
различными машинами. Непереносимость
данных, вызванная разницей в платформах,
сейчас практически преодолена за счет
внедрения общих стандартов представления
данных и наличия программ-перекодировщиков.
До сих пор сохраняется проблема
непереносимости данных внутри одного
компьютера, между разными программами,
создающими разные или даже одинаковые
виды документов, но в различных форматах
внутреннего представления.
Операционная система Windows
изначально ориентирована на высокую
степень интеграции ее компонентов,
важнейшим элементом которой является
возможность эффективного обмена данными
между различными приложениями. Для этих
целей реализовано несколько технологий,
которые мы рассмотрим.
Буфер промежуточного
хранения Clipboard
Уже в первых версиях Windows был
реализован встроенный буфер промежуточного
хранения данных Clipboard
(буфер обмена), который постоянно активен
и доступен всем Windows-приложениям. Обмен
данными через буфер обмена осуществляется
следующим образом.
1.
Выделить в
приложении-источнике фрагмент данных.
2.
Скопировать (перенести)
выделенный фрагмент в буфер обмена
командой Правка►Копировать
или
Правка►Вырезать.
3.
Перейти к
приложению-приемнику,
поместить курсор в то место, куда
требуется вставить данные из буфера, и
выполнить команду Правка►Вставить.
Аналогичный порядок действий
обеспечивает обмен данными и в рамках
одного приложения, поэтому отпадает
необходимость включать в приложения
внутренние средства копирования и
перемещения объектов.
За счет использования обмена
данными через буфер возможно включение
в один документ объектов, созданных
различными приложениями, – создание,
так называемых, составных
документов. Для всех
Windows-приложений установлен ряд стандартных
форматов представления данных, и при
операциях с буфером обмена преобразования
данных для этих форматов выполняются
автоматически и совершенно незаметно
для пользователя.
Для непосредственного
просмотра данных в буфере обмена,
изменения формата представления данных
в нем, записи содержимого буфера в файл
и его очистки используется утилита
Clipboard Viewer
(Clipbrd),
которая является компонентой операционной
системы и устанавливается при ее
инсталляции.
Недостатками обмена с
использованием буфера являются:
некоторое ограничение
объема передаваемой через буфер
информации;
данные, вставленные
в документ-приемник через буфер обмена,
не обновляются при их изменении в
документе-источнике.
Технология DDE
Для обмена данными между
приложениями может использоваться
технология DDE
(Dynamic
Data Exchange – динамический
обмен данными). Суть технологии состоит
в том, что вставляемый через буфер обмена
объект сохраняет свою связь с оригиналом
и при внесении в него изменений может
автоматически обновляться. При этом 1)
с одним оригиналом можно связать любое
число документов; 2) возможно связывание
по цепочке, когда источником является
не оригинал, а ранее связанный объект;
3) установленная связь сохраняется и
после закрытия приложений, т.е. внесенные
в оригинал изменения автоматически
вносятся во все документы, связанные с
ним.
Для использования технологии
DDE следует
обычным путем скопировать объект из
документа приложения-сервера в буфер
обмена, перейти в приложение-клиент, а
затем по команде Правка►Специальная
вставка► переключатель
Связь вставить его в
документ.
Команда Правка►Связи
позволяет, просмотреть все связи для
данного документа, разорвать или
переключить связь с одного объекта на
другой или установить режим ручной
активации связей, когда обновление
информации в документе с изменением
оригинала происходит не автоматически,
а при выполнении соответствующей
команды.
Однако, технология DDE не нашла
широкого распространения, поскольку
при всех достоинствах динамического
обмена данными сложность его
функционирования привела к тому, что
пользователи предпочитали вставку
объектов через буфер обмена из-за ее
простоты и понятности.
При обмене данными по
рассмотренным технологиям объектом
является любой фрагмент, переносимый
из одного приложения в другое. На самом
же деле переносился не сам фрагмент, а
лишь его «экранный образ»: приложение-источник
преобразовывает данные из своего
внутреннего формата в один из стандартов
Windows, и в таком виде фрагмент вставляется
в приложение-приемник. Вставленный
объект является составным элементом
документа, в котором он отображается,
но внести в него изменения довольно
трудно, т.к. для этого требуется
приложение-источник.
Технология
OLE
Технология связывания и
внедрения объектов (Object
Linking and
Embedding) имеет больше
функциональных возможностей, причем,
если приложение поддерживает
OLE, то оно
само выполняет обмен данными по этой
технологии.
Операции связывания (Linking)
и внедрения (Embedding),
реализованные в рамках OLE,
внешне напоминают технологию DDE и обмен
данными через буфер обмена. При работе
по технологии OLE выполняется та же
последовательность действий. Документ
со встроенными OLE-объектами выглядит
аналогично документу с фрагментами,
вставленными через буфер обмена. Однако
в этом случае при двойном щелчке мыши
в поле объекта он активизируется
и запускается приложение, в котором
создавался этот объект, и в него передается
объект для редактирования или выполнения
других операций. После окончания работы
с объектом программа-источник закрывается,
а измененный объект автоматически
передается обратно в документ
приложения-клиента.
В рамках технологии OLE объект
представляет собой сочетание данных
какого-либо вида (текст, графика, видео,
звук и др.) во внутреннем формате
приложения-сервера, представленном в
одном из стандартных форматов Windows, и
информации о создавшей его программе,
размере, времени создания и т.п. Таким
образом, объект является законченной
структурой, переносимой из одного
документа в другой и сохраняющей
отличительные особенности независимо
от типа документа, в котором в данный
момент находится.
При связывании:
отсутствует
необходимость создания второй копии
объекта, что позволяет сократить
требуемый объем дискового пространства;
внесение
изменений в связанный объект обеспечивает
дублирование этих изменений во всех
документах, с которыми объект был связан;
запоминается
путь к оригиналу, поэтому при переносе
на другую машину необходимо переписать
все файлы, содержащие объекты, включенные
в данный документ.
При внедрении:
изменения
вставленного объекта, не отражаются в
оригинале;
вся
информация хранится в одном файле и
никаких проблем при переносе на другой
компьютер не возникает.
В рамках OLE реализован метод
drag-and-drop
(перетащить и бросить), который обеспечивает
наглядность процесса обмена данными,
и его можно применять вместо операции
копирования через буфер обмена даже
при межоконном перемещении объектов и
их частей.
OLE обеспечивает возможность
местной активизации объекта – при
двойном щелчке мышью объект обводится
широкой штриховой рамкой, обозначающей
активность, и остается на месте. Заголовок
окна меняется на заголовок вызываемого
приложения, а меню представляет собой
комбинацию из меню приложения-источника
и приложения-приемника. После выполнения
операций (чаще всего, редактирования)
над объектом возврат в первоначальное
состояние осуществляется по щелчку
мышью за пределами объекта.
Приложение-сервер и
приложение-клиент обмениваются данными
по наиболее новой технологии, доступной
им обоим, т.е., если приложение-источник
поддерживает только DDE, при работе в OLE
объект будет вставлен, но возможность
его активации из документа-приемника
теряется.
OLE-технология,
разработанная корпорацией Microsoft,
обеспечивает:
привязку –
возможность вызова одной программы из
другой;
встраивание –
помещение объектов, созданных в одном
приложении, в документ другого.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #