МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Современные технологии разработки ...
24 downloads
194 Views
384KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Современные технологии разработки программного обеспечения
Методические указания
ПEH3A 2000 1
УДК 681.3.06 С 56 Методические указания посвящены перспективным технологиям разработки программного обеспечения: СОМ, OLE и ActjveX. Их выполнение позволит студентам овладеть методами создания серверных и клиентских приложений, обладающих следующими свойствами: программируемостью, перманентностью и единообразной передачей данных. Выполнение заданий лабораторных работ предполагает использование среды Delphi и операционных систем Windows. Описание лабораторных работ подготовлено на кафедре «Математическое обеспечение и применение ЭВМ и предназначено для студентов специальности 23.01. 05. Таб.1. З. библиогр. 2 назв. С о с т а в и т е л и: А. В. Сивохин, О. С. Дорофеева Под редакцией Б. Г. Хмелевскоro Рецензент С. В. Печерский, кандидат технических наук, доцент кафедры "Вычислительные машины и системы" Пензенского технологического института
2
Введение Модель многокомпонентных объектов СОМ (Component Object Мodеl) ⎯ это одна из архитектур предоставления программных сервисов. программы, созданные с использованием СОМ, обеспечивают доступ к своим сервисам с помощью одного или нескольких СОМ-объектов, создаваемых в клиентских приложениях и являющихся экземплярами классов этих программ, называемых обычно серверами СОМ. Класс в технологии СОМ понимается как конкретная реализация набора интерфейсов, каждый из которых представляет собой процедуры и функции для выполнения определенных задач. Каждый COM-класс поддерживает не менее двух интерфейсов, из которых один интерфейс IUnknown является обязательным. Более того, все другие интерфейсы должны быть производными от интерфейса IUnknown. Технологии OLE и ActiveX фирмы Microsoft, созданные на базе СОМ-модели, ⎯ это ещё один шаг к более совершенным, т. е. более надежным и эффективным, программам. OLE-технология обеспечивает создание составных документов связыванием и внедрением объектов, определенных в серверных приложениях. Технология ActiveX обеспечивает использование всех остальных сервисов, которые возможно создать на базе СОМ-модели. Предлагаемые лабораторные работы посвящены указанным перспективным технологиям разработки программного обеспечения и позволяют овладеть методами создания серверных и клиентских приложений, обладающих такими свойствами, как программируемость, перманентность данных, использование моникёров и единообразной передачи данных, возможность построения составных документов и создания управляющих элементов ActiveX, а также применение распределенных COMобъектов. Выполнение заданий по лабораторным работам ориентируется на среду программирования Delphi версии 6.0 и выше, функционирующую под управлением Windows 2000 или Windows XP.
3
ЛАБОРАТОРНАЯ РАБОТА №1 ВКЛЮЧЕНИЕ АКТИВНЫХ ДОКУМЕНТОВ
OLE
Цель работы ⎯ овладение навыками визуального построения и редактирования активных составных документов в среде DELPHI. Приложения с каждым годом становятся все сложнее. В текстовые процессоры добавляются графические возможности, в электронные таблицы – средства построения диаграмм, и кажется, все закончится одним приложением для решения всех задач. На самом деле цель как раз не в этом, а в интеграции разных приложений. Например, добавлять поддержку графики в текстовый процессор не потребуется, если внутри него можно будет использовать графическое приложение. Пользователю должно предоставляться нечто такое, что выглядит как один документ, хотя на самом деле над разными частями такого документа совместно и согласованно работают разные приложения. Такие документы стали называться составными активными документами, а технология их разработки – технологией составных документов, или технологией OLE (Object Linking and Embedding). Определенный OLE стандартный интерфейс обеспечивает взаимодействие между приложениями любых типов и любых производителей независимо от использованных при этом сред программирования. Когда информация от двух независимых приложений соединяется в одном составном документе, одно приложение служит контейнером, а другое – сервером. Технология OLE позволяет серверу либо внедрять (embed) его данные в контейнер, либо связывать (link) его данные с контейнером. Внедрение означает, что данные сервера сохраняются в том же файле, что и данные контейнера. При связывании, например, данные сервера остаются в своем файле, а в файле контейнера указывается ссылка на них. При разработке приложения определяется, в каком качестве оно должно работать: как контейнер, как сервер или в обоих качествах сразу. При этом контейнер может позволять серверу только внедрять в него данные, или только связывать с ним данные, или и 4
то и другое. Точно также приложение- сервер может сделать свои данные доступные контейнерам либо с помощью связывания, либо только через внедрение, либо и так и так. Например, известные приложения Word и Excel могут быть контейнерами или серверами и обеспечивать как внедрение данных, так и их связывание. При встраивании объекта реальный объект сохраняется в приложении и другие контейнеры OLE не имеют доступа к этому объекту. Встроенные объекты не хранятся в файлах, а содержатся в контейнерах внутри приложения, так что размер контейнера увеличивается на размер вставленного объекта. Встраивание объектов применяют в следующих случаях: 1. Изменения данных влияют только на один объект. 2. Объект имеет небольшие размеры. 3. Объект имеет большие размеры, но приложение не будет распространяться по сети или электронной почте. 4. Объект не планируется моделировать, при этом небольшие изменения должны производиться через единственное приложение. 5. Файл объекта может быть удален или перемещен. 6. На диске имеется достаточно места для размещения приложенияконтейнера. При ассоциировании файл объекта никогда не сохраняется в контейнере, а контейнер имеет лишь ссылку на файл. Файл объекта должен быть создан до того, как на него можно будет ссылаться из контейнера. Заметим что файлы *. doc или *. bmp не являются файлами объекта OLE- это просто файлы данных. Чтобы создать из документа файл объекта OLE и включить его в составной документ, нужно указать, что сервер OLE должен использовать этот файл в формате объекта OLE. Достигается это использованием специальных команд вставки Insert Object, Paste Special и перетаскиванием данных из одного приложения в другое drag-anddrop. Связывание объектов применяется в следующих случаях: 1. Необходимо, чтобы изменения в данных объекта OLE, были отражены во всех приложениях и документах, использующих этот объект. 2. Файл объекта не планируется перемещать или удалять. 5
3. Объект очень большой и планируется его распространять по сети или электронной почте. 4. Имеются ограничения на дисковое пространство. В среде Delphi функции контейнера OLE инкапсулирует визуальная компонента TOleContainer, расположенная на вкладке System панели компонент. Она позволяет создавать новые объекты OLE из имеющихся файлов требуемого типа, встраивая их в контейнер или связывая их с выбранным файлом. При редактировании обеспечивается вызов сервера в собственном окне, либо в окне контейнера. Активизация, сервера в окне контейнера называется активизацией по месту. В этом случае осуществляется слияние меню приложения –контейнера и приложения-сервера по определенным стандартом OLE правилам: элементы меню верхнего уровня с индексами GroupIndex, равными 0, 2 и 4, остаются неизменными, а элементы, для которых свойства GroupIndex равно 1, 3 и 5 будут заменены на меню приложения –сервера OLE. ЗАДАНИЕ 1. Создать и встроить в контейнер новый объект, выполнив следующие действия: 1. Открыть новое приложение в среде Delphi. 2. Выбрать на вкладке System компоненту TOleContainer. 3. Поместив компоненту TOleContainer на форму в произвольное место и увеличить размеры контейнера. 4. Дважды щелкнуть на установленной компоненте. 5. В открывшемся диалоговом окне InsertObiect (вставить объект) выбрать тип объекта из списка ObjectType. 6. Щелкнуть по кнопке OK. 7. Дважды щелкнуть на контейнере. Активизируются приложениесервер в отдельном окне для инициализации объекта, внедренного в контейнер. 8. Все изменения, вводимые в окно сервера, будут немедленно отображаться в окне контейнера. Проверьте это. 9. Закрыть окно сервера. 10. Запустить на выполнение клиентское вновь созданное приложение в окне контейнера будет находиться документ с начальной информацией. 11. Дважды щелкнуть по контейнеру работающего приложения. В отдельном окне загружается сервер для редактирования документа. 6
12. Убедиться, что все изменения, вносимые в окно сервера, немедленно отображаются в окне клиента. 13. Сохранить полученный документ, используя соответствующие команды сервера. ЗАДАНИЕ 2. Создать и встроить новый объект с активизацией по месту, выполнив действия: 1. Открыть новое приложение поместить на форму компоненту TOleContainer. 2. Установить свойство компоненты TOleContainer: Align=alClient; AutoActivate=aaGetFocus. 3. Поместить на форму компоненту TMainMenu. 4. Выполнить пункты 4-10 задания №1. 5. В окне контейнера находится сервер вместе с начальным документом, т. е сервер активизирован по месту объекта. 6. Отредактировать документ и сохранить в отдельном файле ЗАДАНИЕ 3. Создать объект по существующему файлу и встроить его в контейнер, выполнив действия : 1. Открыть новое приложение и поместить на его форму компоненту TOleContainer. 2. Дважды щелкнуть по компоненте. 3. Выбрать опцию Create From File. 4. Найти требуемый файл с помощью кнопки Browse. 5. Щелкнуть на кнопке OK. 6. Убедиться, что создан объект, соответствующий типу выбранного файла и в окне контейнера находится сам файл. 7. Запустить приложение на выполнение. 8. С помощью двойного щелчка запустить сервер и отредактировать файл. 9. Сохранить новую версию файла. ЗАДАНИЕ 4. Создать объект по существующему файлу и связать его с контейнером, выполнив действия третьего задания со следующей модификацией: на шаге 3 установить не только опцию Create From File, но и опцию Link(связать). ЗАДАНИЕ 5. Выполнить задание 3 и 4, обеспечив активизацию сервера по месту расположения объекта. ЗАДАНИЕ 6. Создать приложение с несколькими элементами главного меню и объект с активизацией по месту, затем проверить 7
правила слияния главного меню приложения-контейнера и главного меню приложения-сервера. ЗАДАНИЕ 7. Разместить в контейнере вновь создаваемого приложения объект для сервера Word создать составной документ. ЗАДАНИЕ 8. Используя несколько контейнеров, размещаемых на форме вновь создаваемого приложения, построить составной документ на форме и выполнить редактирование каждой его части. ЗАДАНИЕ 9. Оценить размеры исполняемых файлов для следующих приложений : 1. 2. 3. 4.
Пустое приложение. Приложение с пустым контейнером. Приложение с двумя контейнерами, также пустыми. Приложение с одним контейнером, в котором находится встроенный объект. 5. Приложение с двумя контейнерами, в каждом из которых находятся объекты одного и того же типа, встроенные в соответствующие контейнеры. 6. Приложение с двумя контейнерами, в которых находятся встроенные объекты разных типов. 7. Приложение с одним контейнером, связанным с объектом того или иного типа. 8. Приложение с двумя контейнерами, связанными с объектами одного и того же типа. 9. Приложение с двумя контейнерами, связанные с объектами разных типов. 10. Приложение с большим числом контейнеров, работающие одновременно с несколькими подобными приложениями.
8
ЛАБОРАТОРНАЯ РАБОТА №2 МЕТОДЫ И СВОЙСТВА
OLE-КОНТЕЙНЕРА
Цель работы- изучение возможностей OLE-контейнера на примере методов и свойств визуальной компоненты TOleContainer среды Delphi. Для создания составного документа OLE-контейнер должен поддерживать интерфейсы для взаимодействия с сервером, обеспечивающие внедрение и связывание объектов, а также возможность активизации сервера на месте расположения объекта. Все эти функции инкапсулированы в визуальной компоненте TOleContainer , находящейся на вкладке System палитры компонент среды Delphi. Большинство этих функций скрыты от пользователя, а пользователю для построения приложения-контейнера предоставляется лишь необходимый набор методов и свойств указанной компоненты. Все методы компоненты TОleContainer, доступные пользователю, можно разбить на следующие группы: 1. 2. 3. 4.
Методы для создания и уничтожения объектов. Методы для загрузки и сохранения объектов в файлах и потоках. Методы для управления и контроля объектов. Методы для копирования и вставки объектов с использованием буфера обмена. 5. Методы для работы с диалоговыми окнами объектов. В таблицах 1, 2 и 3 дано описание основных методов и свойств компоненты TОleContainer. Отметим значения свойства AutoActivate: аaDoubleClick-для активизации сервера после двойного щелчка на контейнере (задается по умолчанию); aaGetFocus-для активации сервера при получении контейнером фокуса ввода;
9
aaManual-для активации сервера программными средствами : щелчок по специальной кнопке запуска или по любому другому событию. Таблица1 Методы для создания и уничтожения объектов Метод
Описание
CreateObject CreateObjectFormFile CreateLinkToFile CreateObjectFromInfo DestroyObject
Таблица2.
Создает в контейнере встроенный объект Создает в контейнере встроенный объект на основе данных указанного файла Создает в контейнере связанный объект по указанному физическому файлу Создает в контейнере объект на основе спецификаций записи типа TCreateInfo Уничтожает в контейнере объект со всеми внесенными в него изменениями.
Методы для загрузки и сохранения объектов
Метод
Описание
LoadFromFile
Загружается в контейнер указанного файла
SaveToFile
Сохраняет объект контейнера в указанном файле
StorageInterface
Возвращает ссылку на интерфейс Istorage, методы которого позволяют создавать и уничтожать потоки для объектов Считывает объект из указанного потока
LoadFromStream SaveToStream
объект
из
Сохраняет объект контейнера в указанном потоке
10
Таблица3.
Основные свойства Описание
Метод AllowInPlace AutoActivate Align CanPaste Iconic Linked OleClassName OleObject OleObjectInterface Modified NewInserted SizeMode
Активизация по месту Способ активации объекта Выравнивание контейнера Возможность вставки объекта из буфера В контейнере размещается пиктограмма объекта Объект связан или внедрен Имя класса объекта Ссылка на IDispatch объекта сылка на IOleObject объекта бъект модифицирован Вновь созданный с помощью New объект Способ изменения размера
Значения свойства SizeMode влияют на поведение объекта при изменении размера контейнера следующим образом: smClip-части объекта за пределами контейнера отсекаются(значение по умолчанию); smCenter-объект размещается по центру контейнера; smScale-объект контейнера;
изменяется
пропорционально
до
размеров
smStretch-объект растягивается непропорционально до размеров контейнера; smAutoSize-размер объекта изменяется при изменении размера контейнера, при этом возможно отсечение его частей. Свойство OleClassName содержит идентификаторы программ ProgId-хранимые в реестре и связанные с идентификаторами классов CLSID значения. Идентификатор программы создается в следующем формате : . .
11
ЗАДАНИЕ 1. Составить список значений свойства OleClassName для всех типов объектов, зарегистрированных в системном реестре, выполнив следующие действия : 1. Открыть новое приложение Delphi. 2. Поместить на форму OLE-контейнер. 3. Поместить на форму кнопку с названием OleClassName и окно редактирования с таким же названием. 4. Для события OnClick кнопки написать обработчик, который переписывает значение свойства OleClassName в поле окна редактирования после выполнения метода OleContainer1. InsertObjectDialog, который открывает диалоговое окно InsertObject для выбора очередного типа зарегистрированного объекта. 5. Откомпилировать и запустить приложение. 6. Щелкнуть по кнопки OleClassName, и диалоговом окне выбрать очередной тип объекта и щелкнуть по кнопке Ok. 7. Записать в тетрадь имя типа объекта и значение OleClassName из окна редактирования. 8. Повторить шаги 6и7 для всех типов объектов, поддерживаемых в данной установке. ЗАДАНИЕ 2. Использовать свойства OleObject для доступа к методам сервера, выполнив следующие действия : 1. Открыть новое приложение Delphi. 2. Поместить на форму Ole-контейнер. 3. Поместить на форму три кнопки с названиями NewFile, Insert и SaveFileAs. 4. Написать обработчики события OnClick для указанных кнопок, при этом для кнопки NewFile использовать метод NewFile сервера Word, для кнопки Insert-метод Insert с текстом “Новая строка”, а для кнопки SaveFileAs-метод SaveFileAs (‘NewFile’). 5. Два раза щелкнуть по контейнеру и выбрать тип объекта для текстового процессора Word, затем щелкнуть на кнопке Ok. 6. Запустить приложение. 7. Убедиться, что вызываются требуемые методы, когда последовательно выбираются кнопки на форме приложения NewFile, Insert и SaveFileAs. ЗАДАНИЕ 3. Разработать приложение Delphi, в котором используются все четыре метода создания объектов для серверов с программными идентификаторами ‘Word. Basic’ и ‘Paint. Picture’.
12
ЗАДАНИЕ 4. Разработать приложение для загрузки и сохранения объектов в файлах и потоках. ЗАДАНИЕ 5. Разработать приложение с двумя контейнерами для копирования объектов через буфер обмена, используя методы Copy и Paste, а также свойствоCanPaste компоненты TOleContainer. ЗАДАНИЕ 6. Разработать приложение для вставки объекта из буфера обмена с помощью метода PasteSpecialDialog компоненты TOleContainer, при этом свойства вставленного объекта проверить с помощью другого метода ObjectPropertiesDialog. Приложение должно иметь кнопку NewIcon для изменения пиктограммы объекта с помощью метода ChangeIconDialog. Чтобы в контейнере была пиктограмма объекта, а не сам объект, надо свойству Iconic присвоить значение True. ЗАДАНИЕ 7. Задавать значение для специальных свойств компоненты TOleContainer SizeMode, AutoActvate и др. , выясняя их влияние на вид, размещение и работу объекта.
ЛАБОРАТОРНАЯ РАБОТА №3 РЕГИСТРАЦИЯ СОСТАВНЫХ ОБЪЕКТОВ В СИСТЕМНОМ РЕЕСТРЕ Цель работы- освоение способов поиска включаемых объектов и контроля их регистрации в системном реестре. Кассы вставляемых объектов регистрируются в разделе HKEY_CLASSES_ROOT и имеют ключи ProgId и Insertable. Для их поиска можно использовать объект специального класса Delphi TRegistry, который имеет следующие поля и методы: RootKey-переменная для хранения фрагмента реестра; OpenKey-метод, устанавливающий текущую позицию для поиска в соответствии с заданным ключом; KeyExists-метод, проверяющий наличие записи в реестре; 13
GetKeyNames-метод, формирующий список ключей реестра; ReadString- метод, обеспечивающий чтение текущей записи; СloseKey- метод, для поиска.
производящий сброс установленной позиции
ЗАДАНИЕ 1. Найти в справочном файле класс TRegistry и тщательно изучить его свойства и методы. ЗАДАНИЕ 2. С помощью программы RedEdit открыть системный реестр и познакомиться с его структурой. ЗАДАНИЕ 3. Изучить работу прилагаемой программы поиска включаемых объектов, найти включаемые объекты и список идентификаторов программ, где определены эти объекты, записать в тетрадь. ЗАДАНИЕ 4. Используя идентификатор программ и контейнер клиентского приложения, создать объекты, определенные в этих программах. program Project1; uses Forms, Unit1 in 'Unit1. pas' {IOO}; {$R *. RES} begin Application. Initialize; Application. CreateForm(TIOO, IOO); Application. Run; end. unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, Mask, DBCtrls; 14
type TIOO = class(TForm) ListBox1: TListBox; BtnCancel: TBitBtn; BitBtn3: TBitBtn; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure ListBox1DblClick(Sender: TObject); procedure BtnCancelClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure GIO(olenames, progid:tstrings); private progids:tstrings; { Private declarations } public selected_progid:string; { Public declarations } end; var IOO: TIOO; implementation uses registry;{, oledbu, oleu;} {$R *. DFM} procedure tioo. GIO(olenames, progid:tstrings); var i:integer; oletype, clsid:string; keynames:tstrings; begin keynames:=tstringlist. create; try with tregistry. create do try rootkey:=HKEY_CLASSES_ROOT; if not openkey('\', false) then exit; getkeynames(keynames); with keynames do for i:=0 to count-1 do 15
begin closekey; rootkey:=HKEY_CLASSES_ROOT; if openkey(strings[i], false) then begin if keyexists('Insertable') then begin oletype:=ReadString(''); openkey('CLSID', false); clsid:=ReadString(''); closekey; if openkey('CLSID\'+CLSID, false) then begin olenames. add(oletype); if openkey('ProgId', false) then progid. add(ReadString('')) else progid. add(' [NO PROG ID] '); end;end;end;end; finally free; end; finally keynames. free; end; end; procedure TIOO. FormCreate(Sender: TObject); begin progids:=tstringlist. create; end; procedure TIOO. ListBox1DblClick(Sender: TObject); begin selected_progid:=progids[listbox1. itemindex]; modalresult:=mrok; end; procedure TIOO. BtnCancelClick(Sender: TObject); begin selected_progid:=''; modalresult:=mrcancel; 16
end; procedure TIOO. FormShow(Sender: TObject); begin selected_progid:='Dialog'; GIO(listbox1. items, progids); end; end. ЛАБОРАТОРНАЯ РАБОТА N4 ПРОГРАММНОЕ ИСПОЛЬЗОВАНИЕ ИНТЕРФЕЙСОВ СОМ ОБЪЕКТОВ Цель работы – анализ и исследование аспектов программируемости серверов автоматизации и приобретение навыков использования свойств и методов программируемых объектов при проектировании приложений в среде Delphi. Для совместного использования объектов разными процессами и компьютерами фирма Microsoft создала на базе модели СОМ – объектов технологию автоматизации. Автоматизация – это независимая от приложений технология программирования, которая позволяет модулям EXE и DLL предоставлять один или несколько объектов, независимых объектами автоматизации, клиенту или контроллеру автоматизации. Сами модули EXE и DLL называют при этом серверами автоматизации. Таким образом сервисы автоматизации предоставляются не только пользователем при работе за пульсом, но и проектировщикам приложений. В этом случае, объекты автоматизации, управляемые внешними приложениями, называют иногда программируемыми объектами. Чтобы стать программируемым, приложению – серверу нужно лишь обеспечить обращение к своим внутренним функциям через методы СОМ- интерфейсов. Однако на практике так не поступают. Хотя СОМ – объектом действительно используются для обеспечения прграммируемости конкретные механизмы обычно в реализации несколько сложнее. Однако, их использование в клиентских приложениях становится простыми и удобными. 17
В настоящее время для получения доступа к объектам автоматизации используется механизм, в основе которого лежит специальный объект, который является СОМ – объектом и поддерживает интерфейс IDispatch. Именно этот интерфейс обеспечивает клиентам доступ к свойствам и методам любого программируемого приложения. Он называется диспетчерским интерфейсом, или сокращено диспинтерфейсом. Некоторые объекты поддерживают также дуальный диспетчерский интерфейс, который обладает всеми возможностями диспетчерского интерфейса IDispatch, но позволяет также вызывать методы и через виртуальную таблицу, как в обычных интерфейсах СОМ – объектов. Прежде чем использовать объект автоматизации, необходимо выяснить, какими свойствами и методами он обладает. Для методов надо также выяснить количество, тип и назначение параметров. Для этих целей разработчик объектов автоматизации должен поставить проектировщикам клиентских приложений электронную документацию для элементов ОСХ, элементов управления ActiveX и серверов автоматизации. Эта документация содержит информацию о типах и используется не только в контроллерах автоматизации, но и в интерпретаторах и компиляторах для проверки синтаксиса и типа. Информация о типах включает: а) определения перечислимых типов; б) описание интерфейсов типа Interface; в) описания диспетчерского интерфейса IDispatch и дуального диспетчерского интерфейса; г) описание классов составных объектов; д) ссылки на описание типов в других библиотеках. Наиболее сложным при работе с сервером автоматизации является поиск информации о свойствах и методах, поддерживаемых конкретным сервером. При этом информация такого рода может хранится в файлах следующих типов: а) в файлах формата библиотеки типов *. tlb; б) в файлах формата типов объектов *. olb; в) в файлах *. exe в качестве их ресурсов; 18
г) в файлах *. dll в качестве их ресурсов; д) в составном документе OLE; е) в специально созданных справочных файлах, например для текстового процессора Word в файле Wordbasic. hlp. При разработке сервера в среде Delphi по умолчанию создается файл формата *. tlb, который компонуется одновременно с выполняемым файлом на этапе компиляции. Среда Delphi значительно упрощает доступ к серверам автоматизации. Если известен идентификатор сервера объекта ClassName, то с помощью функции CreateOleObject можно создать объект автоматизации и получить доступ к его свойствам и методам, используя диспетчерский интерфейс, указатель на который возвращает эта функция. Прототип этой функции следующий: function CreateOleObject(const ClassName:String):IDispatch. Например, для создания объекта сервера Word и вставки в документ текста с использованием этого объекта следует написать код: Uses ComObj; Var WordVar:OleVariant; …………………………………………. procedure Tform1. ButtonClick(Sender:TObject); begin WordVar:=CreateOleObject(‘Word. Basic’); WordVar:=Insert(‘Вставка в документ’); end; Аналогичным образом можно вызвать следующие методы объекта Word: AppShow; FileExit; FileNew; FileClose; FileSave; FileSave(‘NewName’); LineUp; LineDown; FormatFont(…). Заметим, что последний метод имеет 20 необязательных параметров. В Delphi число параметров любого метода не должно превышать 64, а тип свойства или параметра метода ограничен следующим списком: 19
Byte, Integer, SmallInt, Currency, Double, Single, WideString, TDateTime, WordBool и OleVariant. Тип OleVariant. Совместим со всеми указанными типами, а также с вариантными массивами. Поскольку элементом такого массива может быть также вариантный массив, передаваемые аргументы для методов могут быть сколь угодно сложными. Для методов объектов автоматизации разрешены следующие четыре способа передачи аргументов: а) классический способ, когда задаются все аргументы метода; б) позиционный метод, когда отсутствующие аргументы заменяются запятыми, при этом последние запятые в списке аргументов перед закрывающей скобкой опускаются; в) именованный, когда указываются только необходимые значения аргументов вместе с их именами; г) комбинированный способ, когда сначала задаются позиционные аргументы, а затем необходимые именованные. Если параметром является вариантный массив, то в клиентском приложении можно использовать встроенные функции для определения его характеристик: VarArrayDimCount, VarArrayLowBound, VarArrayHighBound и др.
ЗАДАНИЕ1. Найти в каталоге…\Delphi 3\Sourse\Classes определения вариантных записей TVarRec и TvarData, записать их в тетрадь, сопоставить друг с другом и сравнить с возможностями типов Variant и OleVariant, а также объяснить, почему тип OleVariant лучше приспособлен для реализации программируемости приложений.
ЗАДАНИЕ2. Найти программу, где бы использовались переменные типа TvarRec, TvarData, OleVariant типов.
ЗАДАНИЕ3. Разработать клиентское приложение, моделирующие работу с файлами в текстовом процессоре Word. 20
ЗАДАНИЕ4. Разработать текстовый процессор, в котором помимо ввода и редактирования текста, производится установка шрифтов и их характеристик, причем для этих целей используется удобный интерфейс и горячие клавиши.
ЗАДАНИЕ5. Разработать текстовый процессор для удобного форматирования страниц и построения структуры документа.
ЗАДАНИЕ6. Разработать построитель справочных файлов, используя объекты автоматизации текстового процессора Word и графического редактора PaintBrush.
ЗАДАНИЕ7. Разработать упрощенный и удобный графический редактор, используя сервисы фирменных графических редакторов.
ЛАБОРАТОРНАЯ РАБОТА N5 СПЕЦИФИКАЦИЯ ИНТЕРФЕЙСОВ СОМ – ОБЪЕКТОВ НА ЯЗЫКЕ IDL Цель работы – овладение основными выразительными средствами языка IDL для описания классов составных объектов и объектов OLE – автоматизации, их простых и диспетчерских интерфейсов, методов и свойств таких интерфейсов, специальных типов и библиотек классов, интерфейсов и специальных типов. Объекты – центральная идея СОМ – технологии и различных ее модификаций. Объект включает предопределенный набор данных, называемых состояниями или атрибутами, и несколько групп методов – интерфейсов объекта. Конкретная реализация набора интерфейсов определяет класс СОМ – объекта. Возможность работать с объектами разных классов, каждый из которых поддерживает данный набор интерфейсов, но реализует их поразному, называется полиморфизмом. Инкапсуляция для объектов означает, что данные объекта недоступны его клиентам непосредственно; доступ к ним осуществляется только с помощью специальных методов Set и Get. Из двух видов наследования: 21
наследование реализации, или когда и наследование интерфейса – СОМ – объекта поддерживают только наследование интерфейса, поэтому всегда для наследуемых методов в классах – потомках надо писать свой код реализации зтих методов. Из этих определений следует, что СОМ – технология предоставляет разработчикам и пользователям программного обеспечения возможности и преимущества объекта – ориентированного подхода независимо от используемых сред программирования. Для использования СОМ – объектов необходимо иметь формальное описание их интерфейсов, используемых методов и доступных атрибутов, или их свойств. Это описание необходимо как разработчикам клиентских и серверных приложений, так и специальным программам генерации заместителей и заглушек объектов, предназначенным для упаковки и распаковки передаваемых методом параметров – маршалинга и демаршалинга параметров. СОМ – технология жестко не фиксирует выразительные средства для составления формального описания объектов, но тем не менее имеет мощный стандартный инструмент для этих целей, называемый языком описания интерфейсов IDL(Interface Definition LangUage). Формальное описание объектов состоит из ряда операторов и размещается в файле с расширением *. idl. Однако, можно использовать и другие расширения. Оператор содержит ключевое слово, определяющее его функцию, списки атрибутов, имен, констант, типов, а также другие элементы, зависящие от назначения оператора. Интерфейс Ivnknown является фундаментальным интерфейсом для СОМ – объектов и все другие интерфейсы должны наследовать его три метода QueryInterface, AddRef и Release. В формальное описание можно импортировать любые операторы из других файлов, указав эти файлы в списке import. Возвращаемое многими методами значение типа HRESULT является стандартным значением, указывающим, был ли вызов обработан успешно. Параметры методов могут быть как угодно сложными: массивами, структурами и т. п. Их тип определяется оператором typedef, аналогичным оператору языка Си. Базовые типы для СОМ – объектов ограничены из сложности упаковки и распаковки 22
параметров при их передачи для вызова удаленных процедур. Перечислим эти типы: boolean, byte, char, double, float, handle_t, hyper(64-х разрядное целое со знаком ), int, long, short, small, void*, wchar_t(16 бит без знака ). После того как спецификация интерфейса где-то описана, и интерфейс начал работать или задействован в выпущенной версии какого либо программного обеспечения, изменять его уже нельзя. Это – жесткое ограничение СОМ – технологии. Для использования интерфейсов разработчик обязан создать библиотеку типов и справочный файл. Библиотека типов создается автоматически по формальному описанию типов, в котором задан оператор Library. В этом операторе разработчик с помощью атрибута helpfile задает имя справочного файла. Контекстные строки и идентификаторы разделов справочного файла указываются в соответствующих спецификациях формального описания(атрибуты helpstring и helpcontext). Формат оператора определение библиотеки типов library: [Глобально уникальный идентификатор библиотеки uuid [, Список дополнительных атрибутов optinal-atribute-list ] ] library имя библиотеки типов libname { Определения definitions }; Список дополнительных атрибутов может включать: control, helpfile, helpstring, helpcontext, hidden, loid, restricted и version. Определения описывают импортируемые библиотеки. Типы данных, модули, интерфейсы, диспинтерфейсы и классы составных объектов для рассматриваемого объекта. Компилятор создает библиотеку типов с именем libname. tlb, используя информацию как внутри оператора library, так и за его пределами, используя соответствующие ссылки или базовые типы. ПРИМЕР. [ uuid( … ), heipfile(“helptype. hlp”), 23
helpstring(“Class”), version(1. 0) ] library TextToolLib { importlib(“stdole32. tlb”) [ uuid( … ) ] coclass CoTextTools { interface ISpellChecker; interface IThesaurus; } } В этом примере информацию по указанным интерфейсам компилятор будет брать из операторов определения интерфейсов interface, которые должны предшествовать оператору library. Формат оператора определения класса составного объекта coclass: [ Список атрибутов attribute-list] coclass имя класса составного объекта classname { [ Дополнительные атрибуты attribute] interface
имя интерфейса interface,
dispinterface ………………; } В списке атрибутов должен быть обязательно указан глобально идентификатор класса с помощью атрибута uuid. Эта 16-байтовая строка будет записываться как CLSID в системный реестр. 24
Необязательные атрибуты могут быть выбраны из следующего списка: helpstring, helpcontext, licensed, version, control, hidden и appobject. Дополнительными атрибутами могут быть: souree, default и restricted. Они принадлежат интерфейсам класса. ПРИМЕРЫ. [ uuid( … ), version(1. 0), helpstring(“CoClass”), Helpcontext(2481), Appobject ] coclass MyApp { [ sourse ] interface IMyDocFuncs: IUnknown, dispinterface DMyDocFuncs; } [ uuid( … ) ] coclass More { [ restricted ] interface bar, interface baz; } Оператор coclass предоставляет список интерфейсов, Поддерживаемых определенным классом. Формат оператора определения интерфейса interface: [ Список атрибутов интерфейса interface-attribute-list ] interface имя интерфейса interface-name { [ import список импортируемых файла import-file-list, ] 25
[ cpp_quote (“Строка вставки String”)] [ const тип константы const-type идентификатор identificator= константное выражение const-expession;…] [ [ typedef ] [[список атрибутов типа type-attribute-list ]] спецификатор типа type-specifier список описателей declaratorlist;…] [[[ список атрибутов функции function-attr-list]] спецификатор типа type-specifier [описатель указателя pointer-declarator] имя функции function-name ( [ [ список атрибутов параметров parametr-attribute-list ] ] спецификатор типа type-spacifier [ declarator ], … ); ………. . ] } Список атрибутов интерфейса должен содержать либо атрибут uuid, либо атрибут local. Остальные атрибуты не обязательны. Имя интерфейса должно содержать не более 17 знаков. Допустимые типы для константы: integer, character, boolean, void*, byte, string, char*, byte*, wchar_t*. Идентификатор константы ограничен длиной в 31 знак. В списке атрибутов типа можно указывать следующие атрибуты: handle, switch_type, transmit_as, ref, unique, ptr, context_handle, ignore и string. Атрибуты в списке отделяются запятой. Остальная часть опции typedef такая же, как в Си. Допустимыми атрибутами списка function-attr-list являются:callback, local, ref, unique, ptr, string, ignore и contexthandle. Описатель указателя может включать *, far и const. 26
Имя function-name определяет имя удаленной процедуры. Список атрибутов параметров состоит из следующих элементов : in, out, first_is, last_is, length_is, max_is, size_is, switch_type, ref, unigue, ptr, context_handle и string. Используемые в операторе описатели declorator являются идентификаторами, описателями указателей и массивов. Пример. [uuid (…), version(3. 1), pointer_default(unique) ] interface IdlGrammarExample {import “windows. idl”, ”other. idl”, const wchar_t * NAME=L”Example Program”; typedef char* PCHAR; void DictCheckSpelling( [in, string] PCHAR word,
// разыскиваемое слово;
[out ]
//о, если слово не найдено
short *is Present
; ); } Для определения диспетчерского интерфейса используются два формата : [атрибуты attributes] dispinterface имя диспетчерского интерфейса intfname {properties : список свойств proplist; methods: список методов methlist; }; 27
или [атрибуты attributes] dispinterface имя диспетчерского интерфейса intfname { interface имя переопределяемого интерфейса interfacename }; Формат определения интерфейса Ole-объекта: [object, uuid(string-uuid)[, список атрибутов интерфейса interfaceattribute-list] ] interface имя интерфейса interface-name: базовый интерфейс base-interface {…} Здесь имя base-interface определяет Ole-интерфейс, от которого новый интерфейс наследует функции, коды состояния и атрибуты интерфейса. Все Ole-интерфейса образуются из интерфейса Unknown или какого-либо другого Ole-интерфейса, например, IDispatch. Список атрибутов интерфейса не должен включать атрибут версии, а также другие атрибуты, характерные для RPCинтерфейса. По умолчанию компилятор создает DLL для заместителя как клиентского приложения, так и серверов объекта. Однако наличие атрибута local приводит к генерации лишь заголовочного файла. Пример. [object, uuid(ABCDEF00-1234-1234-5678-ABCDEF123456)] interface Istream:Iunknown {typedef Istream*LPSTREAM; 28
… } В Ole-интерфейсе все функции-члены являются виртуальными. У виртуальных функций первый параметр неявный и содержит указатель this. Тип возвращаемого значения всегда HRESULT. Это означает, что при возникновении исключительной ситуации в удаленной процедуре заместитель объекта перехватывает код ошибки и передает его в качестве возвращаемого значения. Заметим, что атрибут local может быть указан для какого-либо метода интерфейса. В этом случае компилятор не генерирует заместителя для метода. ЗАДАНИЕ 1. Познакомиться с содержанием справочного файла MIDL. HLP, расположенного в каталоге F:\ Borland \ Shared \ MSHelp. Если этого файла нет в указанном каталоге, постарайтесь найти его в другом месте. Найдите основные операторы языка описания интерфейса IDL:library, coclass, module, importlib, typedef, interface, dispinterface, method и property. Скопировать в отдельный файл предлагаемые примеры. ЗАДАНИЕ 2. Составьте формальное описание, в которое были бы включены все операторы языка IDL и использованы указанные примеры. Изучая атрибуты языка IDL, дополняйте этими атрибутами составленное формальное описание. Следите за тем, чтобы атрибуты не противоречили друг другу. Сделайте несколько описаний. ЗАДАНИЕ 3. Откомпилируйте составленные варианты описаний и внимательно изучите сгенерированные файлы. ЗАДАНИЕ 4. Создайте библиотеку типов для составленного вами полномасштабного формального описания, преобразуйте эту библиотеку *. tlb в файл *. pas с помощью утилиты tlbimp. exe, находящийся в каталоге …\Delphi 3\BIN, и сохраните оба файла в рабочем каталоге. ЗАДАНИЕ 5. Загрузите редактор библиотек типов среды Delphi, откройте в нем созданную библиотеку и произведите ее модификацию. Изучите изменения, произошедшие в файле *. pas и в модуле реализации методов Unit2.
29
ЛАБОРАТОРНАЯ РАБОТА № 6 КОМПИЛЯТОР СПЕЦИФИКАЦИЙ COM-ОБЪЕКТОВ
Цель работы ⎯ приобретение навыков применения компилятора MIDL Среды MS-DOS и опций его командной строки для автоматической генерации на языке Си заголовочного файла и файлов заместителя заглушки, а также специального файла библиотеки типов по формальному описанию Компилятор MIDL(Microsoft Interfase Definition Lan интерфейсов Com-объектов. guage) автоматически инсталируется как составная часть установки Win32 SDK. По формальным описаниям интерфейсов Com-объектов он генерирует на Си интерфейсы OLE, интерфейсы RPC или библиотеки типов в зависимости от ключевых операторов IDL и устанавливаемых в командной строке режимов. Справка о режимах может быть получена с помощью команды midl. exe/help или midl. exe/?. Опции компилятора можно задавать не только в командной строке, но и в специальных файлах, ссылаясь на них с помощьюимен файлов, имеющих префикс”@”. Каждый аргумент в файле должен начинаться и заканчиваться в одной и той же строке, при зтом не допускаются вложенные файлы с опциями. В командной строке допуска -ется комбинация опций и имен файлов: midl. exe –pack 4 @ midl 1. rsp-env win32 @ midl 2. rsp itf. idl. При работе компилятор MIDL вызывает препроцессор и компилятор Си, а также включает в клиннтские и сервеские прложения статические, псевдодинамические и динамические библиотеки, состав которы зависит от операционной среды приложений:MS-DOS, Windows 3. x, Windows NT и Windows 95. Командная строка компилятора после вставки опций из командных файлов, заданных в команде midl. exe[switch[switchoptions]]…filename, где switch-ключевое слово предшествует знак”/”;
командной
строки,
switch-options- опции ключевого слова ; filename-имя файла с описаниями на языке IDL. 30
которому
Как правило, компилятор обрабатывает один файл с описаниями на языке IDL, чтобы указать специальные требования приложения к конфигурации системы. По умолчанию, когда в формальном описании не встречаются атрибуты object или local при определениии интерфейсов, компилятор генерирует слндующие файлы интерфейса RPC с именами, образуемыми из имени name файла IDL : name_C. C-клиентская заглушка ; name_S. C- серверная заглушка; name. H-заголовочный файл; Когда в списке атрибутов интерфейса появляется атрибут object, компимлятор генерирует следующие файлы интерфейса OLE: name_P. C-файл заместителя интерфейса; name. H- заголовочный файл интерфейса; name_I. C-файл идентификатора UUID интерфейса; Когда в списке атрибутов интерфейса появляется атрибут local, компилятор генерирует лишь один файл name. H- заголовочный файл интерфейса. Если в формальном описании встречается оператор library, то компилятор генерирует специальный файл name. tlb библиотеки типов. Если при этом определения интерфейса находятся до оператора library, а в теле оператора используются ссылки на эти операторы, то генерируются как файлы на Си для соответствующего интерфейса, так и файл библиотеки типов. Задание1. Составить формальное описание интерфейсов типа RPC, откомпилировать это описание и изучить содержание файлов name_C. C, name_S. C и name. H. Задание2. Включить в описание интерфейсов атрибутobject, откомпи-лировать и сопоставить полученные файлы name_P. C, name. H и name_I. C с файлами задании1.
name_C. C,
name_S. C и name. 31
H, полученными в
Задание3. После описания интерфейсов включить оператор library, откомпи-лировать и проанализировать полученные файлы, после чего, используя утилиту tlbimp или редактор библиотеки типов среды Delphi, преобразуйте файл *. tlb в файл *. pas и изучите этот файл. Задание4. Составьте описание откомпилируйте это описание.
библиотеки
типов
и
Задание5. Изучите наиболее важные ключи компилятора и, используя эти клучи, откомпелируйте какое-либо описание IDL.
ЛАБОРАТОРНАЯ РАБОТА №7 РЕДАКТОР БИБЛИОТЕКИ ТИПОВ СРЕДЫ DELPHI
Цель работы ⎯ приобретение навыков анализа существующих библиотек типов Type Libraries и овладение приемами их создания и модификации в среде Deiphi. Информация о типе обьекта включает в себя описание всего, что нужно знать клиенту для эффективного использования сервисов обьекта. Для каждого из поддерживаемых обьектом интерфейсов необходимо указать список методов и свойств интерфейса, а также дать описание параметров этих методов. Чтобы предоставить информацию о типе клиентам обьекта, разработчик может создать и распространять библиотеку типа, содержащую стандартизованное описание интерфейсов обьекта. При этом библиотека может распространяться либо в виде обычного файла, либо в виде потока внутри файла структурированного хранилища Storage. Иногда библиотеку помещают в виде ресурса в исполняемый модуль. В среде Delphi для просмотра, создания и модификации библиотек типов имеется специальный редактор Type Library Editor. ЗАДАНИЕ 1. Открыть библиотеку типов с помощью редактора Delphi. выполнив следующие действия: 1. Создать рабочий каталог OldTypeLib. 2. На системном диске найти файлы с расширением *. tlb или *. olb. 32
3. Перекопировать в рабочий каталог несколько таких файлов. 4. Открыть один из этих файлов в среде Delphi, исполнив команду File/Open/Рабочий каталог/*. tlb;*. olb. Редактор библиотеки типов позволяет создать новые типы не только для Com-обьектов, но и для управляющих элементов и серверов ActiveX. Он имеет следующие панели и окна. 1. Панель типов, которая содержит кнопки для создания новых типов Interface, DispIntf, CoClass, Enum, Method и Property, кнопку Register для регистрации класса обьекта. 2. Окно дерева типов для просмотра структуры открытой или вновь создаваемой библиотеки и выбора требуемого типа. 3. Окно спецификаций типов, состоящие из вкладки атрибутов, типа Attributes и вкладки с названием Uses или Members в зависимости от выбранного типа. Структура и содержание вкладок определяется тем элементом, который выделен на дереве типов. На некоторых вкладках атрибутов, Attributes имеется панель переключателей или флагов Flags. ЗАДАНИЕ 2. Проанализировать открытую библиотеку типов в следующей последовательности: 1. На дереве типов выделить библиотеку (три ромбика). 2. На вкладке атрибутов Attributes прочитать и записать в тетрадь для последующей работы -имя библиотеки Name; -глобально уникальный идентификатор библиотеки GUID; -версию библиотеки Version; -язык для записи текстовых строк в библиотеке LCID задаваемый идентификатором места действия (locale identifier), описывающим один национальный язык ; -контекстную строку библиотеки в справочном файле Help String; -имя справочного файла для библиотеки Help File; -идентификатор справки для библиотеки Help Context; 33
-флаги Flags:None –флаги не установлены;Restricted-запрет использования библиотеки в средах программирования макросов; Control-библиотека содержит элемент управления для пораждения новых библиотек типов и Com-классов; Hidden-библиотека не будет открываться в пользовательских броузерах. 3. По вкладке Uses определить имена и версии других библиотек типов и записать в тетрадь пути для соответствующих файлов. Заметим, что библиотека stdole32. tlb является основной библиотекой типов Windows. Здесь описан также интерфейс IDispatch. 4. На дереве типов выделить составной класс CoClass библиотеки. 5. На вкладке атрибутов Attributes найдите и запишите в тетрадь: -имя составного класса Name; -глобально уникальный его идентификатор GUID; -контекстную строку класса в справочном файле Help String; -версию составного класса Version; -флаги Flags:Licensed –лицензионный; Control-составной класс является элементом управления ActiveX; Application Objectсоставной класс помещен во внешний сервер, т. е. в EXE-файл. 6. По вкладке Members выясните: -имя интерфейсов и диспинтерфейсов, рассматриваемом классе;
реализованных
в
-глобально уникальные идентификаторы GUID этих интерфейсов; -указания, является ли интерфейс или диспинтерфейс источником сообщений; -указания о программируемости интерфейсов диспинтерфейсов в средах программирования макросов ; -указания о невозможности использования диспинтерфейсов в таких средах.
или
интерфейсов или
7. На дереве типов выделите какой-либо интерфейс библиотеки. 8. На вкладке атрибутов Attributes найдите и запишите в тетрадь: 34
-название интерфейса Name; -глобально уникальный идентификатор интерфейса GUID; -контекстную строку интерфейса в справочном файле Help String; -контекстный идентификатор Context;
справки для интерфейса Help
-версию интерфейса Version; -имя базового интерфейса Parent Interfase (который не должен использоваться для интерфейсов DispInterfase ) ; -флаги Flags: DispInterfase –достур к методам только с помощью Invoke; Hidden-интерфейс не показывается в пользовательских броузерах; Nonextensible-реализация IDispatch включает только те методы и свойства, которые показаны в описании интерфейса;Dualдуальный интерфейс;Ole Automation-интерфейс использует совместимые с Ole-автоматизацией типы данных:Byte, Smallint, Integer, Single, Double, Currency, TdateTime, WideString, WordBool и OleVariant. 9. На вкладке Members ознакомьтесь с методами и свойствами рассматриваемого интерфейса и их индексами диспетчирования DispId, выясните, какие свойства используются только для чтения readonly, а какие –только для записи writeonly. 10. Выбирая на дереве типов указанные методы и свойства, по вкладке Atributes убедитесь в их соответствии на вкладке Members рассматриваемого интерфейса, а также ознакомтесь с их флагами Flags: Restricted-запрещает использование в средах программирования макросов; Sourse-возвращаемое значение типа Variant является источником сообщений; Bindable-свойство поддерживает связывание данных; ReguestEdit-свойство поддерживает сообщение OnReguestEdit; 35
Display Binable-свойство должно быть показано пользователю как поддерживающее связывание; Default Binable- поддерживающее связывание данных свойство по умолчанию; Hidden-интерфейс существует, пользоватеьских броузерах.
но
не
показывается
11. Просмотрите перечислимые типы библиотеки, дереве элементы Enum.
в
выбирая на
12. Если на дереве типов имеются неизвестные типы, ознакомтесь с ними и запишите их атрибуты в тетрадь вместе с указанием файла библиотеки, где они находятся. Задание3. Изучить спецификации типов для среды Delphi, выполнив следующие действия: 1. С помощью редактора открыть библиотеку типов. 2. Нажать клавишу F12, обеспечивающую переход на модуль спецификаций типов данной библиотеки. 3. Найти в тексте спецификации каждого элемента дерева типов библиотеки. 4. С помощью справочной системы Delphi изучите новые синтаксические конструкции, использованнные для спецификации типов. 5. Войдите в MS-DOS и запустите утилиту преобразования библиотек типов в спецификации среды Delphi: …\ Delphi3\Bin\tlibimp. exe *. tlb 6. Сохраните для справок полученный файл *. pas. Задание4. Изучите назначение и использование типов заданной библиотеки типов с помощью справочной системы Windows в следующей последовательности: 1. Открыть библиотеку типов, Editor среды Delphi.
используя редактор Type Library
2. Выбрав библиотеку на дереве типов, по вкладке Atributes найти имя справочного файла библиотеки HelpFile. 36
3. Запустить справочную систему WinHelp. exe, задав для нее имя указанного файла HelpFile. 4. Изучить назначение и использование типов рассматриваемой библиотеки. Задание5. Произвести анализ ссылочной или импортируемых библиотек типов, выполнив действия: 1. Открыть библиотеку и выбрать ее элемент в окне дерева типов. 2. На вкладке импортируемых библиотек Uses найти имена, версии и пути для одной из этих библиотек. 3. Закрыть редактор библиотек типов. 4. Открыть новую библиотеку и произвести анализ (см. Задания2 и 3). Задание6. Создать новую библиотеку типов с именем библиотеки BeepLib и именем Com-класса Beeper, включив в эту библиотеку интерфейс Ibeeper с одним методом Beep и двумя свойствами Sound и SoundBeep, а также перечислимый тип SoundTypes со значениями : MB_OK=0;MB_ICONHAND=16; MB_ICONQUESTION=32; MB_ICONEXCLAMATION=48; MB_ICONASTERISK=64. передаваемых по Метод Beep-процедура без параметров, протоколу safecall. Свойство Sound должно иметь тип SoundTypes и предназначено для чтения и записи. Свойство SoundBeep должно быть индексируемым по переменной SoundType типа SoundTypes и возвращать значения типа SoundTypes по указанному индексу. Это свойство только для чтения. Для создания новой библиотеки следующие действия:
типов необходимо выполнить
1. Открыть редактор библиотек типов :File\New\Active X\Type Library. 2. Задать имя библиотеки BeepLib на вкладке Atributes, при этом другие атрибуты можно не указывать. 3. Щелкнуть мышью по кнопке CoClass, что приведет к созданию и добавлению в библиотеку класса составного объекта с именем по умолчанию. 37
4. Ввести имя класса Beeper в поле Name вкладки атрибутов для сздаваемого класса. 5. Щелкнуть мышью по кнопке Interfase и ввести имя интерфейса Ibeeper. 6. Выделить элемент Ibeeper на дереве типов. 7. Щелкнуть на кнопку Method и ввести в поле Declaration вкладки Atributes метод prcedure Beep, а в поле индекса диспетчирования ID единицу. 8. . Щелкнуть по кнопке Property и ввести в поле Declaration вкладки Atributes свойство property Sound: SoundTypes, а в поле ID двойку. 9. Еще раз щелкнуть по кнопке Property и ввести второе свойство property SoundBeep[SoundType: SoundTypes]: SoundTypes, а в поле ID тройку. Поскольку это свойство предназначено только для чтения, в поле Property Type установить значение Read. 10. Выделить на дереве типов элемент Ibeeper и проверить на вкладке Members правильность ввода метода и свойств интерфейса. В случае необходимости скорректировать неправильный элемент, выбрав его на дереве типов. 11. Щелкнуть мышью по кнопке Enum и ввести в поле Name вкладки Atributes имя перечислимого типа SoundTypes. 12. На вкладке Members ввести заданные перечислимые константы. 13. Нажать клавишу F12 пульта и проанализировать полученные спецификации. 14. Сохранить в рабочем каталоге вновь созданную библиотеку, выполнив команду File\Save as.
38
ЛАБОРАТОРНАЯ РАБОТА № 8 СОЗДАНИЕ СЕРВЕРОВ СОСТАВНЫХ ОБЪЕКТОВ COM
Цель работы-овладения навыками программирования и использования основных интерфейсов серверов составных объектов COM в среде Delphi. Базовым классом для всех интерфейсов COM-объектов является интерфейс IUnknown, имеющий следующее описание в модуле ActiveX среды программирования Delphi: IUnknown =class public function QueryInterfase(const IID:TGID;var Obj): HResult; virtual; stdcall; abstract; function AddRef: Longint; virtual; stdcall; abstract; function Release : Longint; virtual; stdcall; abstract; end; Поэтому описание нового интерфейса INewInterfase должно выглядеть следующим образом: INew Interfase=class(IUnknown) public Описание методов нового интерфейса end; В этом описании все новые методы должны быть чисто виртуальными, т. е. иметь описатели virtual и abstract. Способ передачи параметров обычно выбирается как stdcall. Функция QueryInterfase использует глобальный идентификатор интерфейса в качестве передаваемого параметра. Разрабатываемый составной объект должен иметь глобально уникальный идентификатор, Который называется идентификатором класса CLSID. Типом того и другого идентификатора является запись следующего вида: TCLSID=TGUID ; TGUID=record 39
D1:Integer; D2:Word; D3:Word; D4:Array[0. . 7] of Byte Описание составного объекта, имеющего интерфейс INewInterfase, Должно включать перечень всех методов интерфейсов IUnknown и INewInterfase с описателем override(переопределяет). Это описание должно включаться в модуль сервера слелующим образом: Unit SerNewInterfase; interfase uses Windows, Ole2, SysUtils; const Class_NewIntfComponentObject: TCLSID= (D1:$ABCDEF01; D2:$1234; D3:$5678; D4:$AB, $CD, $EF, $FF, $12, $34, $56, $78)); type TNewIntfComponentObject=class(NewInterfase) private FRefCount:Longint; //-счетчик ссылок, идентифицируемый нулем; ………. . /’;[p-0 public constructor Create; destructor Destroy; override; function QueryInterfase(const IID:TGUID;var Obj): HResult; override; function AddRef: Longint; override; function Release : Longint; override; end; var Global_Object_Count:Logint; //-глобальный счетчик ссылок; imlementation ………… function TNewIntfComponentObject(const IID:TGUID;var Obj): HResult; stdcall; begin Pointer(Obj):=Nil; Result:= E_NOINTERFASE;//-по умолчанию интерфейс не //поддерживается if IsEqual CLSID(IID, IID_IUnknown) or IsEqual CLSID(IID, IID_Imalloc) then 40
begin TNewIntfComponentObject(Obj):=Self; TNewIntfComponentObject(Obj). AddRef; Result: =S_OK; end; end; function TnewIntfComponentObject. AddRef :Longint; begin Inc(FRefCount); Inc(Global_Object_Count); Result: = FRefCount; end; function TnewIntfComponentObject. Release :Longint; begin Dec(FRefCount); Dec(Global_Object_Count); Result: = FRefCount; if FRefCount=0 then Destroy; end; …………………. Реализация методов нового интерфейса INew Interfase; …………………. initialization Global_Object_Count:=0; End. Для генерации составных объектов в сервер должен быть включен специальный класс фабрики объектов TClassFactory с интерфейсом IclassFactory, в котором только два метода CreateInstance и LockServer. Метод CreateInstance обеспечивает создание объекта того класса, с которым связан объект типа TClassFactory, а метод LockServer используется при создании нескольких объектов для сохранения сервера в памяти. Описание класса TClassFactory и реализация его двух методов выглядит следующим образом: type TClassFactory=( IClassFactory) private FRefCount:Longint; public function CreateInstance(unkOuter:IUnknown; const IID:TGID;varObj): HResult;override; function LockServer(fLock:Bool): HResult;override; end; 41
imlementation function TClassFactory. CreateInstance(unkOuter:IUnknown; const IID:TGID;varObj): HResult; var NewIntfComponentObject:TNewIntfComponentObject; if(unkOuter < > Nil) then //-если объединение интерфейсов не //поддерживается begin Result:=CLASS_E_NOAGGREGATION Exit; end; try NewIntfComponentObject:=TNewIntfComponentObject. Create; try AddRef; Result:= NewIntfComponentObject. QueryInterfase(IDD, Obj); finally Release; end; except Result:=E_OUTOFMEMORY; end; end; function TClassFactory. LockServer(fLock:Bool):Hresult; begin if fLock then Inc(Global_Object_Count); else Dec(Global_Object_Count); Result:=NOERROR; end; Заметим, что использование ключевого слова interfase позволяет более компактно определять новые интерфейсы. Специальные классы TComObject и TComObjectFactory сокращают исходный код сервера, так как при их использовании не надо определять реализации методов IUnknown и IClassFactory. В этом случае определение класса составного объекта должно выглядеть следующим образом: TNewIntfComponentObject=class(TComObject, TComObjectFactory, INewInterfase) Определение методов нового интерфейса 42
end; Для взаимодействия с Windows сервер в процессе должен экспортировать две функции DllGetClassObject и DllCanUnloadNow. Внешний сервер должен включать специальные объекты _заглушки, обеспечивающие распаковку параметров и передачу клиентам результатов вызовов методов. В свою очередь клиентские приложения должны иметь в своем составе объектызаместителии для упаковки и передачи параметров серверам. Задание1. Разработать сервер в процессе, включающий один составной объект и поддерживающий два собственных интерфейса, а также стандартные интерфейсы IUnknown и IClassFactory, используя возможности среды Delphi. Задание2. Разработать внешний сервер, включающий несколько объектов, не используя при этом инструментальные средства DAX среды Delphi.
ЛАБОРАТОРНАЯ РАБОТА №9 СОЗДАНИЕ СЕРВЕРОВ АВТОМАТИЗАЦИИ
Цель работы ⎯ овладение методами визуального объектноориентированного проектирования серверов автоматизации и использование инструментальных средств DAX среды Delphi. В Delphi 3 все средства взаимодействия с архитектурой Active X были усовершенствованы, что привело к созданию новой инструментальной среды DAX (Delphi Active X framework). Среда DAX значительно упростила программирование элементов COM, OLE и Active X. В рамках этой среды создан полностью обновленный класс TautoObject, который реализует интерфейс IUnknown и находится в модуле ComObj. Кроме того среда DAX Поддерживает прозрачный доступ к библиотекам типов с помощью редактора Type Library Editor, который облегчает работу с объектами автоматизации и базовыми элементами управления Active X. 43
Проектирование серверов автоматизации с использованием инструментальных средств DAX включает следующие пять этапов: 1. Выбор типа создаваемого сервера. Для создания внешнего сервера (локального или удаленного ) необходимо воспользоваться командой File/New Application. Для создания внутреннего сервера(сервера в процессе) следует выполнить команду File/New выбрать пиктограмму Active X Library.
и во вкладке Active X
2. Запуск мастера автоматизации. Для создания объекта автоматизации необходимо запустить мастера Automation Object Wizart с помощью следующих действий:File/New вкладка Active X/Элемент Automation Object/ Два щелка. Впоявившемся диалоговом окне Automation Object Wizart следует задать имя класса создаваемого составного объекта и способ его использования : Sinle-при работе будет использоваться только одна копия объекта ; Multiple-при работе будет образовываться каждому запросу на создание объекта ;
новая
копия по
Internal-объект будет использоваться только в данном приложении и не требует регистрации в системном реестре. Имя класса составного объекта строится по правилам Delphi и не должно превышать 17 знаков. 3. Запуск редактора библиотеки типов Type Library Editor и создание библиотеки типов для создаваемого составного объекта. Запуск редактора Type Library Editor осуществляется автоматически после щелчка на кнопке OK мастера автоматизации. Редактор создает имя библиотеки типов объекта, по умолчанию совпадающее с именем проекта. Необходимо задать новое подходящее имя, так как имя библиотеки вместе с именем класса объекта и разделяющей их точкой составляют идентификатор создаваемого сервера автоматизации, который будет занесен в системный реестр и затем использоваться в методе Create Ole Object для создания объекта автоматизации. После задания имени библиотеки типов, необходимо установить другие ее атрибуты :версию, имя справочного файла, разработанного для вновь 44
создаваемого объекта, контекстную строку и идентификатор раздела справочного файла для самой библиотеки, а также флаг. Теперь необходимо выполнить основную работу по определению методов интерфейса объекта, производного от IDispatch, его свойств и перечислимых типов. Завершив эту работу, необходимо щелкнуть по кнопке Refresh для обновления содержимого вновь созданного файла библиотеки типов, а затем произвести сохранение библиотеки *. tlb и библиотечного файла *. pas в рабочем каталоге проекта. 4. Кодирование методов объекта автоматизации. Одновременно с созданием библиотеки *. tlb и библиотечного файла *. pas, в названиях которых присутствует имя библиотеки, редактор Type Library Editor формирует файл обычно с названием Unit2. pas, в который помещает заголовки для новых методов. Следует найти этот файл и выполнить кодирование методов интерфейса объекта. Далее надо откомпилировать проект и устранить неизбежные ошибки, кодировании.
допущенные при
Следует задать необходимые имена модулей проекта и проверить в тексте имя класса объекта и имя библиотеки типов. В разделе инициализации модуля Unit2. pas формируется специальная строка:TAutoObjectFactory. create(ComServer, имя класса объекта модуля, имя класса объекта для регистрации, переключатель использования объекта); Здесь TAutoObjectFactory является частью среды DAX для каждого проекта сервера ; имя класса объекта модуля ⎯ это имя класса объектно-ориентированной среды программирования Delphi, в которой обращается создаваемый объект ; имя класса объекта для регистрации ⎯ это то имя, которое было задано в мастере автоматизации в качестве имени класса; последний параметр принимает одно из значений Single, Multiple или Internal, которое было также задано в мастере автоматизации. Созданный в указанной строке объект DAX выполняет следующие три задачи: 1)Объект автоматизации регистрируется вместе с объектом сервера COM. 45
2)В системном реестре записывается информация идентификаторе класса и его идентификаторе программы. 3)Объект TAutoObjectFactory интерфейса
выполняет
все
об
обязанности
IclassFactory самостоятельно, поэтому при проектировании не нужно создавать код большого объема для каждого нового объекта. 5. Регистрация сервера автоматизации в системном реестре. Внешний сервер регистрируется автоматически при его запуске на исполнение. Внутренний сервер регистрируется Run/Register Active X Server.
с
помощью
Задание 1. Создать внешний сервер автоматизации, данные
команды используя
5-го задания лабораторной работы №7, спроектировать клиентское приложение для этого сервера и провести испытания на локальном и удаленном уровне. Задание 2. Создать внутренний сервер автоматизации для тех же исходных данных и провести его испытания.
46
ЛАБОРАТОРНАЯ РАБОТА №10
ИСПОЛЬЗОВАНИЕ И СОЗДАНИЕ УПРАВЛЯЮЩИХ ЭЛЕМЕНТОВ ACTIVEX
Цель работы ⎯ овладение методами использования и создания управляющих элементов ActiveX в среде Delphi. Управляющие элементы ActiveX-это программные компоненты, код которых может использоваться в любой среде программирования, поддерживающей технологию ActiveX. Среда Delphi обеспечивает как использование таких элементов, так и их создание. Для использования управляющих элементов в среде Delphi их необходимо установить в палитру компонент. Этот процесс установки разбивается на следующие этапы: 1. Регистрация элементов ActiveX в реестре Windows, если они там еще не зарегистрированы. Сами элементы обычно помещают в каталог…\WinNT\System32(файлы с расширением *. ocx). 2. Создание файла OLE-оболочки с расширением *. pas для использования в проете приложения или создания пакета. 3. Добавления файла пользовательский пакет.
оболочки
в
стандартный
или
4. Инсталляция пакета с целью установки управляющего элемента ActiveX в палитру компонент на вкладку Active X или какую-либо другую вкладку. Задание1. Установить управляющий элемент hours.ocx(часы), находящиеся в каталоге …\WinNT\System32, в палитру компонент Delphi на вкладку Active X, выполнив следующие действия : 1. Создать модуль test, в который будет добавляться элемент ActiveX File\New\Package\Ok\ NewPackage:File name=test; Description=’Управляющий элемент hours. ocx’. \Ok. 2. В открывшемся диалоговом окне состава пакета щелкнуть на 47
кнопке Add(”+”). 3. В диалоговом окне Add выбрать вкладку Import ActiveX. 4. В модифицированном окне Add просмотреть список всех зарегистрированных в Windows элементов управления Registered Controls и найти элемент hours.ocx. Если он найден, т. е. зарегистрирован, то перейти к шагу 6, иначе перейти к шагу 5 для регистрации элемента. 5. Щелкнуть на *кнопке Add вкладки Import ActiveX диалоговой панели Add и в открывшемся окне Register Ole Control найти файл hours.ocx управляющего элемента. Выбрать этот файл и щелкнуть на кнопке Open. Элемент регистрируется в системном реестре, а диалоговое окно Register Ole Control исчезает с экрана. 6. В списке зарегистрированных элементов Registered Controls вкладки Import ActiveX диалогового окна Add найти элемент Hours Ole Control module и проверить значения элементов в нижней части диалогового окна: а) окно ClassNames должно содержать список имен классов управляющего элемента; б) поле Palette page указывает вкладку на палитре компонент и может быть изменено ; в) поле Unit file name содержит полный путь к файлу оболочки, которую Delphi создает в качестве интерфейса в элементе ActiveX и размещает в том же каталоге, в котором находится файл элемента ActiveX, при этом имя файла оболочки совпадает с именем управляющего элемента и имеет расширение *. pas, а также префикс ах; г) в поле Search Path должны быть указаны каталоги для поиска файлов при компиляции. 7. Package ть на кнопке Ok вкладки Import ActiveX окна Add, что позволит среде Delphi создать оболочку для управляющего элемента, после чего этот элемент можно использовать в Delphi. 48
8. После возврата в диалоговое окно Package щелкнуть на кнопке Build для сохранения и компиляции пакета. 9. Установить созданный после компиляции пакет, щелкнув на кнопке Install того же окна Package. 10. После появления сообщения об успешной установке пакета Test.dpl щелкнуть на кнопку Ok и убедиться в том, что на вкладке ActiveX управляющего элемента появилась новая пиктограмма. Задание2. оболочки
С помощью текстового редактора
прочитать файл
Axhours.pas и познакомиться с его структурой, обратив особое внимание на свойства и методы управляющего элемента, доступные для разработки приложений, а также на специальный защищенный метод InitControlData, Который присваивает классу уникальный идентификатор класса и уникальные идентификаторы событий и вместе с тем выполняет специфические действия по инициализации объекта. Задание3. Создать приложение с использованием одного или нескольких управляющих элементов ActiveX, при необходимости установив их на палитру компонент. Для передачи необязательных параметров используемых методов элементов использовать переменные типа Variant со значениями Unassignet или VT_EMPTY, а также свойство Ole Object, позволяющее не указывать такие параметры в списке.
Задание4. Создать управляющий элемент ActiveX на базе виртуальной компоненты Delphi, являющейся потомком класса TwinControl, выполнив следующие шаги: 1. Запустить мастера ActivXControl:File/New/Вкладка ActivX/Пиктограмма ActivXControl/Два щелчка. 2. В диалоговом окне выбрать компоненту VCL, которую нужно преобразовать в управляющий элемент ActivX, и включить или отключить информацию о лицензировании, версии и т. п. 49
3. Щелкнуть на кнопке Ok и убедиться, что Delphi создал библиотеку типов со всеми свойствами, объявленными как public и published, методами и событиями, а также два файла исходного кода с определениями из библиотеки типов и с реализациями методов интерфейса управляющего элемента. 4. Если Delphi преобразовал не все конструкции компоненты или требуется добавить новые свойства, методы и события, то открыть библиотеку типов с помощью команды View/Type/Library, внести необходимые изменения и щелкнуть на кнопке Refresh для обновления исходного кода. 5. Создать код для всех обработчиков событий и всех методов Get и Set, в которых не реализована необходимая функциональность или которые оставлены пустыми. 6. Создать одну или несколько страниц свойств, вызываемых правой кнопкой мыши для изменения значений свойств элемента управления ActivX: File/New/ВкладкаActiveX/PropertyPageДва щелчка/Создание страницы свойств/OK. 7. Откомпилировать созданные файлы. 8. Зарегистрировать управляющий элемент ActiveX:Run/Register ActiveX Server. 9. Установить новый управляющий элемент ActiveX в среде Delphi:Component/Install ActiveX Control. 10. Создать приложение и проверить работу нового управляющего элемента. Задание5. Создать управляющий элемент ActiveX на базе визуальной компоненты Delphi, являющейся потомком класса TGraphicControl, выполнив следующие шаги: 1. Взять в качестве примера компоненту Tpie или любую другую простую компоненту, являющуюся потомком класса TGraphicControl. 2. Найти в каталогах Delphi исходный файл Pies. pas для выбранной компоненты и переписать его в рабочий каталог.
50
3. В исходном модуле компоненты заменить базовый класс TGraphicControl на класс TCustomControl и сохранить файл. 4. В список путей поиска проекта добавить полный путь к файлу Pies. pas:Project/Options/Вкладка Directories/Conditionals поле Search. pas. 5. установить компонент Tpie в палитру компонент Delphi:File/Open/File of type=*. dpk(Delphi Pascage source/Переход в каталог Delphi и поиск файла PieLib. dpk/Два щелчка на PieLib. dpk/Щелчок на кнопке Install редактора модулей Pascage Editor/OK. 6. Проверить появление модифицированной компоненты в палитре компонент Delphi. 7. Создать управляющий элемент ActiveX на базе модифицированной компоненты Tpie, являющейся теперь потомком класса TCustomControl, который является потомком класса TwinControl, как это описано в четвертом задании.
ЛАБОРАТОРНАЯ РАБОТА №11 СОЗДАНИЕ АКТИВНЫХ ФОРМ ACTIVEFORM
Цель работы – овладение методами создания и распространения по сети Internet активных форм ActiveForm в среде Delphi. Активная форма ⎯ это набор визуальных и невизуальных компонент для создания смешанного, или агрегированного элемента управления. Клиентам представляются только те свойства, методы и события, которые непосредственно связаны с формой, и не доступны свойства, методы и события используемых в форме компонент VCL. Визуальные управляющие элементы можно помещать на форму, получая один простой комбинированный управляющий элемент ActiveX. Можно создавать и целые приложения, 51
обладающие одной формой, которые будут распространяться как активные формы ActiveForm. Если необходимо предоставить клиентам доступ к свойствам внутренних компонент VCL, то следует добавить в активную форму ActiveForm новые свойства и методы точно также, как это делалось при создании управляющих элементов ActiveX на базе компонент VCL. Задание1. Создать активную форму ActiveX с помощью мастера активных форм среды Delphi, выполнив следующие этапы построения: 1. Запустить мастера активных форм ActiveForm, команды:
исполнив
File/New/Вкладка ActiveX/Пиктограмма ActiveForm /Два щелчка. 2. Для получения компоненты TActiveForm , облачается форма
в которую
ActiveForm, необходимо указать в открывшемся диалоговом окне следующие имена и опции : а) имя создаваемого элемента ActiveX; б) имя модуля реализации новых методов элемента; в) имя проекта; г) включить или отключить лицензирование; д) установить другие опции активной формы. 3. Щелкнуть на кнопке OK диалогового окна для создания библиотеки типов, в которую войдут свойства public и published, методы и события TactiveForm, и двух файлов исходного кода, в одном из которых содержится информация из библиотеки типов, а во втором – реализации методов интерфейса. 4. Вставить в форму ActiveForm один или несколько визуальных или невизуальных компонент. 5. Открыть редактор TypeLibraryEditor:Viev/TypeLibrary. 52
библиотек
типов
6. Добавить в библиотеку создаваемой формы одно или несколько свойств, методов и событий, а затем щелкнуть на кнопке Refresh для обновления модулей исходного кода. 7. Написать код для всех методов Get и Set, функциональность которых не реализована полностью или которые вновь добавлены и оставлены пустыми. 8. Написать код для обработчиков событий активной формы ActiveForm. 9. Разработать одну или несколько страниц свойств для изменения значений свойств активной формы с помощью правой кнопки мыши, при этом можно использовать четыре стандартные страницы для управления цветами, шрифтами, изображениями и списками строк Delphi: File/New/Вкладка ActiveX/Пиктограмма PropertyPage /Два щелчка. 10. Откомпилировать созданную активную форму. 11. Зарегистрировать новую активную форму в системном реестре: Run/Register ActiveX Server. 12. Проверить регистрацию ActiveForm: Component/Install ActiveX Control/Панель Import ActiveX control/Список Registered controls/Созданная активная форма ActiveForm. Созданный файл *.ocx можно импортировать в любую среду программирования, которая поддерживает технологию ActiveX. В частности его можно использовать на сервере Web, как и любой другой управляющий элемент ActiveX. Для этого надо настроить параметры компилятора, влияющие на распространение в Web, и перекомпилировать проект. Задание 2. Подготовить активную форму ActiveForm для распространения и использования в Internet, выполнив следующую последовательность действий: 1. Исполнить команду Project/Web Deployment Options. 2. В поле Target Dir указать каталог на сервере Web, в который надо установить файл *. ocx для активной формы ActiveForm(см. каталоги. . \ServerMashine\OCX_File или C:\OCX_Files).
53
3. В поле Target URL указать адрес, по которому должен обратиться броузер клиента, чтобы получить доступ к активной форме ActiveForm, при этом адрес должен быть корректным указателем URL, определяющим Web-сервер. 4. В поле HTML Dir указать каталог, в котором Delphi создаст HTML-документ со ссылкой на созданную активную форму ActiveForm, или каталог, заданный в поле Target Dir. 5. Щелкнуть на кнопке OK. 6. Исполнить команду Project/Build All для создания библиотеки ActiveX *. ocx, которая будет содержать активную форму ActiveForm. 7. Исполнить команду Project/WebDeploy для копирования указанной библиотеки в каталог Target Dir и создания в каталоге HTML Dir HTML-документа, имя которого будет совпадать с именем проекта, а расширение -*. htm. Этот файл содержит ссылку на элемнт ocx, путь по которому был задан в поле Target URL. 8. Вызвать броузер Web лля просмотра HTML-документа активной формы. 9. Активная форма появится на экране и будет выполняться в броузере как встроенное прилижение. Задание3. Подготовить управляющий элемент ActiveX для распространения и использования в сети Internet, выполнив для выбранного в системном реестре элемента действия второго задания.
54
СОДЕРЖАНИЕ Введение………………………………………………………………....3 Лабораторная работа № 1. Включение активных документов OLE…4 Лабораторная работа № 2. Методы и свойства ОLE-контейнера……9 Лабораторная работа № 3. Регистрация составных объектов в системном реестре…………………………………………………………13 Лабораторная работа № 4. Программное использование интерфейсов СОМ-объектов…………………………………………………………14 Лабораторная работа № 5. Спецификация интерфейсов СОM-объектов на языке IDL……………………………………………………….18 Лабораторная работа № 6. Компилятор спецификаций СОМобъектов………………………………………………………………...25 Лабораторная работа № 7. Редактор библиотеки типов среды DELPHI…………………………………………………………………28 Лабораторная работа № 8. Создание серверов составных объектов СОМ…………………………………………………………………….34 Лабораторная работа № 9. Создание серверов автоматизации……39 Лабораторная работа № 10. Использование и создание управляющих элементов ActiveX……………………………………………………..42 Лабораторная работа № 11. Создание aктивных форм АсtivеForm..46 Список литературы…………………………………………………….49 Приложение А. Программа поиска включаемых объектов в системном реестре……………………………………………………………..50 Приложение Б. Программа СОМ-сервера и клиентского приложения………………………………………………………………………53 Приложение В. Программа OLE-сервера и клиентского приложения……………………………………………………………………...66 55
СОВРЕМЕННЫЕ ТЕХНОЛОГИИ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Методические указания Редактор Е. Ю. Беззубова Технический редактор П. А. Вьялкова Корректор Ж. А. Лубенцова Компьютерная верстка Н. В. Ивановой ЛР № 020347 от 14.01.97. Сдано в производство 19.09.2000. Формат 60X84l/16. Бумага газетная. Печать офсетная. Усл. печ. л. 4,18. Уч-изд. л. 4,97. Заказ 624. Тираж 75. «С» Издательство Пензенского государственного университета. 440017, Пенза, Красная, 40.
56