Главная » Все файлы » Просмотр файлов из архивов » Документы » Разработка интегрированных прикладных программ (Меньшикова К. Г.)

Разработка интегрированных прикладных программ (Меньшикова К. Г.), страница 2

2015-08-23СтудИзба

Описание файла

Документ из архива "Разработка интегрированных прикладных программ (Меньшикова К. Г.)", который расположен в категории "". Всё это находится в предмете "проектирование программного обеспечения автоматизированных систем" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "проектирование по автоматизированных систем" в общих файлах.

Онлайн просмотр документа "Разработка интегрированных прикладных программ (Меньшикова К. Г.)"

Текст 2 страницы из документа "Разработка интегрированных прикладных программ (Меньшикова К. Г.)"

Выбрав кнопку Export To IDL, можно получить описание на языке IDL интерфейса IDayWeek, входящего в состав библиотеки типов “Project_DayWeek Library”:

Project_DayWeek.idl
[ uuid(C55ED6A4-5583-4E88-8317-0539445A5F6E),
version(1.0),
helpstring("Project_DayWeek Library")
]
library Project_DayWeek
{ importlib("stdole2.tlb");
[ uuid(C13BFB8F-C655-43CA-80D9-C53B659E5C85),
version(1.0),
helpstring("Dispatch interface for DayWeek Object"),
dual,
oleautomation
]
interface IDayWeek: IDispatch
{ [ id(0x00000001) ]
HRESULT _stdcall Today([out] BSTR * str );
[ id(0x00000002) ]
HRESULT _stdcall Data_Day([in] BSTR dat, [out] int * n, [out] BSTR * week );
[ propget, id(0x00000003) ]
HRESULT _stdcall Visible([out, retval] VARIANT_BOOL * Value );
[ propput, id(0x00000003) ]
HRESULT _stdcall Visible([in] VARIANT_BOOL Value );
};
[uuid(3E979810-8A64-4EAE-9F1E-8C582079F4AF),
version(1.0), helpstring("DayWeek Object") ]
coclass DayWeek
{ [default] interface IDayWeek; };
};

Рис. 2

Заготовки модуля DayWeekImpl заполняются соответствующим кодом.

Метод Data_Day возвращает номер и название дня недели для заданной даты:

STDMETHODIMP TDayWeekImpl::Data_Day(BSTR dat, int* n, BSTR* week)
{ int i; AnsiString str; str=(AnsiString)dat;
Form1->day_date(str,i); Form1->day_week(i,str);
*n =i; *week= WideString(str.c_str()).c_bstr();
return S_OK; }

Метод Today возвращает текущую дату и название дня недели:

STDMETHODIMP TDayWeekImpl::Today(BSTR* str)
{ AnsiString s;
s=Form1->Label2->Caption + " " + Form1->
Label3->Caption;
*str= WideString(s.c_str()).c_bstr(); return S_OK; }

Два следующих метода get_Visible и set_Visible отвечают за чтение и установку свойства Visible, которое позволяет сделать видимым или невидимым приложение-сервер:

STDMETHODIMP TDayWeekImpl::get_Visible(VARIANT_BOOL* Value)
{ try
{ *Value=Form1->Visible; }
catch(Exception &e)
{ return Error(e.Message.c_str(), IID_IDayWeek); }
return S_OK; };
STDMETHODIMP TDayWeekImpl::set_Visible(VARIANT_BOOL Value)
{try
{ Form1->Visible=Value; }
catch(Exception &e)
{ return Error(e.Message.c_str(), IID_IDayWeek); }
return S_OK; };

При описании параметров методов сервера автоматизации используются типы данных, принятые в IDL. Часто используются типы данных, которым легко можно найти аналог в языке программирования (short - двухбайтовое целое число со знаком, long - четырехбайтовое целое число со знаком, single - четырехбайтовое действительное число, double - восьмибайтовое действительное число, BSTR - двоичная строка, VARIANT_BOOL - true= 1, false = 0). Можно использовать также и другие типы данных.

После компиляции и запуска сервера на выполнение он зарегистрируется в реестре. При необходимости удаления записей рекомендуется запустить его с ключом /unregserver. При переносе сервера автоматизации в другой каталог, можно запустить его снова, при этом записи в реестре обновятся. Записи делаются в разделах реестра HKEY_LOCAL_MASHINE\SOFTWARE и HKEY_CLASSES.

После создания сервера автоматизации, основываясь на информации, содержащейся в библиотеке типов, можно создавать приложения, управляющие этим сервером, т.е. контроллеры автоматизации. Это можно сделать с помощью различных инструментариев, включая Visual C++, Delphi, C++Builder, VBA и т.д.

2.2.Контроллер на C++Builder (позднее связывание)

Приложения, управляющие серверами автоматизации, называются контроллерами автоматизации. Создадим контроллер, управляющий сервером «День недели», основываясь на информации о методах класса его объекта автоматизации.

На рис. 3 представлено окно контроллера, содержащее кнопки для установки и разрыва связи с объектом, флажок видимости сервера и кнопки управления свойством Visible, а также кнопки для получения данных, метки для отображения данных в окне, поле Edit1 для ввода даты. После запуска контроллера (при нажатии кнопки Connect) запускается сервер. При нажатии кнопки Disconnect он выгружается. Кнопка SetVisible проявляет и скрывает окно сервера в зависимости от наличия флажка на компоненте CheckBox1, но и будучи невидимым, сервер продолжает выполнять свои функции. Нажатие кнопки GetVisible приводит флажок в соответствие значению свойства Visible сервера.

Рис. 3

Чтобы общение с COM-объектом сервера стало возможно, в модуль следует включить строку #include .

Для управления сервером следует создать переменную Serv типа Variant, во время работы она будет содержать указатель на интерфейс IDispatch COM-объекта. Для создания экземпляра COM-объекта можно использовать функцию CreateOleObject из модуля ComObj библиотеки VCL: Variant Serv;

Serv=CreateOleObject("Project_DayWeek.DayWeek");

Эта функция создаст IDispatch и вернет указатель на него. IDispatch дает доступ к диспетчерскому интерфейсу объекта сервера, методы которого мы хотим вызывать. Для создания объекта CreateOleObject вызывает функцию CoCreateInstance, являющуюся частью спецификации COM Windows API.

Прерывание связи контроллера с сервером:

if (VarType(Serv)==varDispatch) Serv=Unassigned;

Выражение VarType(Serv)==varDispatch проверяет, содержит ли вариантная переменная Serv указатель на диспетчерский интерфейс. Эта проверка производится перед любым обращением к объекту сервера. Обращение к процедурам сервера осуществляет метод OleProcedure, первым параметром которого является имя метода диспетчерского интерфейса, а остальные – фактические параметры этого метода. Примеры таких вызовов:

WideString s, str1, str2; int n;
// Вызов метода Today:
if (VarType(Serv)==varDispatch)
Serv.OleProcedure("Today",&s);
// Вызов метода Data_Day:
str1=Edit1->Text;
if (VarType(Serv)==varDispatch)
Serv.OleProcedure("Data_Day",str1,&n,&str2);

За работу со свойствами COM-объекта отвечают методы OlePropertyGet и OlePropertySet. Примеры работы со свойством Visible нашего сервера:

// Установить значение свойства по заданию пользователя:
if (VarType(Serv)==varDispatch)
Serv.OlePropertySet("Visible",CheckBox1->Checked);
// Запросить у сервера значение свойства:
if (VarType(Serv)==varDispatch)
CheckBox1->Checked=Serv.OlePropertyGet("Visible");

2.3.Контроллер позднего связывания (Delphi)

Код контроллера позднего связывания в Delphi будет выглядеть проще, так как в этом случае можно обращаться к методам и свойствам объектов внутри вариантных переменных. При позднем связывании может быть заранее неизвестно, существуют ли такие свойства и методы. Просто компилятор не проверяет их наличие, а воспринимает их названия как обычную символьную строку. Ошибки в этом случае проявятся лишь на этапе выполнения программы.

Для связи с сервером понадобится переменная типа Variant. Serv:Variant, а в секции uses должны присутствовать ссылки на модули Variants и ComObj.

Рассмотрим код контроллера. Установка связи и разрыв связи с сервером выполняются точно также, как и при создании контроллера в Builder C++:

if VarType(Serv)<>varDispatch then
Serv:=CreateOLEObject('Project_DayWeek.DayWeek');
if VarType(Serv)=varDispatch then
Serv:=Unassigned;

Операторы установки и получения значения свойства Visible сервера будут выглядеть так, как будто речь идет о свойстве обычного компонента среды Delphi:

if VarType(Serv)=varDispatch then
Serv.Visible:=CheckBox1.Checked;
if VarType(Serv)=varDispatch then
CheckBox1.Checked:=Serv.Visible;

Для получения текущей даты и дня недели потребуется объявить переменную специального типа WideString (аналог типа BSTR):

var str:WideString;
Serv.Today(str); Label1.Caption:=str;

При обращении к методу Data_Day придется объявить переменные для получения результатов (тип WideString и integer), а входную строку можно взять прямо из поля Edit1.Text:

var str:WideString; i:integer;
Serv.Data_Day(Edit1.Text,i,str);
Label2.Caption:=str; Label3.Caption:=IntToStr(i);

2.4.Контроллер на основе библиотеки типов (Delphi)

Для того чтобы правильность обращений к серверу можно было выявить уже на этапе компиляции и не допустить внесения в код контроллера незамеченных ошибок, на стороне контроллера можно создать набор классов для управления сервером. Классы строятся на основе библиотеки типов объектов предполагаемого для использования сервера. Для этого следует:

  • выбрать команду Project | Import Type Library…;

  • в списке открывшегося диалогового окна выбрать импортируемый сервер (в нашем случае Project_DayWeek Library);

  • снять флажок Generate Component Wrapper (внесения компонента на панель компонентов не требуется);

  • нажать кнопку Create Unit для создания файла с расширением .pas, который должен быть включен в проект контроллера. Файл содержит набор классов с теми же методами и свойства, что и объект автоматизации.

После импорта библиотеки типов создать контроллер можно двумя способами (раннее и позднее связывание).

Раннее связывание (early binding) подразумевает создание в приложении-клиенте (в контроллере) таблицы виртуальных методов, аналогичной виртуальной таблице сервера. Для этого

  • в модуль клиента добавить строку:
    uses Project_DayWeek_TLB;

  • в секции private класса формы (TForm1) объявить:

Serv: IDayWeek;

Интерфейс IDayWeek объявлен в импортируемом модуле как наследник интерфейса IDispatch, оболочкой для него является класс CoDayWeek. Для связи с сервером необходимо обратиться к методу Create этого класса (с точки зрения программы - просто создать объект класса CoDayWeek):

if not Assigned(Serv) then Serv:=CoDayWeek.Create;

Для разрыва связи с сервером необходимо проверить наличие ссылки на объект в переменной Serv и присвоить ей значение nil. При этом Delphi проверяет наличие ссылки на интерфейс сервера и вызывает его метод Release.

if Assigned(Serv) then Serv:=nil;

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

Label1.Caption:=Serv.Visible;

Так как компилятор при этом не проверяет правильность обращения к серверу, а для обращения используются вариантные переменные, то код работоспособен (преобразование типа происходит автоматически). В случае раннего связывания (и вообще в случае использования библиотеки типов) такое присваивание невозможно.

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

Контроллер позднего связывания с использованием библиотеки типов будет производить синтаксическую проверку правильности обращения к свойствам и методам сервера уже на этапе компиляции. При его создании в код следует добавить видимость модулей:

uses Project_DayWeek_TLB, ComObj;

Переменную Serv объявить как ссылку на диспетчерский интерфейс:

Serv: IDayWeekDisp;

Связаться с сервером можно так:

if not Assigned(Serv) then Serv:=CreateOLEObject
('Project_DayWeek.DayWeek') as IDayWeekDisp;

Остальной код ничем не отличается от раннего связывания.

2.5.Контоллер на VBA

Идеальным контроллером автоматизации является Excel. Конечно, можно использовать и любое другое офисное приложение, однако удобнее и быстрее всего осуществить проверку работоспособности сервера можно именно в Excel.

Для проверки сервера можно на рабочий лист рабочей книги поместить кнопки, как это показано на рис. 4, подготовить текст (жирный шрифт) и ввести дату в ячейку “F10”. Затем перейти в редактор Visual Basic и создать обработчики для кнопок.

Для организации позднего связывания можно просто объявить переменную – объект для связи с сервером: Dim Serv As Object

Остальной код будет выглядеть так:

  • создание объекта автоматизации

Set Serv = CreateObject("Project_DayWeek.DayWeek")

Рис. 4

  • прерывание связи Set Serv = Nothing

  • работа со свойством Visible

Serv.Visible = Range("C6").Value (установить)
Range("C6").Value = Serv.Visible (получить)

  • для получения данных придется объявить специальные переменные: Dim str As String

Call Serv.Today(str)
Range("G5").Value = str

  • для передачи значения можно использовать ячейки рабочего листа:

Dim i As Long
Dim str As String
Call Serv.Data_Day(Range("F10").Value, i, str)
Range("H10").Value = i
Range("G10").Value = str

Для использования библиотеки типов пользователь или автор рабочей книги, войдя в редактор Visual Basic, должен выбрать в меню команду Tools | References…, а в появившемся списке установить флажок на Project_DayWeek Library (список всех библиотек типов Excel считывает при загрузке из раздела реестра TypeLib). После этого пользователь может просматривать методы и свойства сервера, выбрав в меню команду View | Object Browser.

Если после этого объявить переменную Serv, как ссылку на соответствующий интерфейс (Dim Serv As IDayWeek), то программный код будет использовать библиотеку типов.

3.Управление офисными приложениями

Практически все, что может сделать пользователь, работая с приложениями MS Office, доступно для автоматизации. Для управления сервером, конечно, необходимо знать, какие объекты, свойства и методы предоставлены разработчиками сервера для автоматизации. Эти сведения содержатся обычно в документации, в справочной системе или в литературе.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5209
Авторов
на СтудИзбе
430
Средний доход
с одного платного файла
Обучение Подробнее