Створення серверів автоматизації за допомогою C + + Builder

Що таке автоматизація


Переважна більшість сучасних настільних додатків призначено для виконання користувачами тих чи інших операцій – створення документів, проведення розрахунків, аналізу даних і т.д. У процесі виконання подібного роду робіт застосовуються різні внутрішні сервіси цих додатків, наприклад, обчислення значень за формулами, автоматична нумерація абзаців, заголовків або сторінок, перевірка орфографії та багато іншого. Нерідко подібні додатки володіють вбудованими макромови, що дозволяють створити код, що використовує ці сервіси, наприклад, у випадку часто повторюваних послідовностей операцій. Інакше кажучи, додатки подібного рода.обладают програмованість.

Відзначимо, однак, що програмування за допомогою макромов має свої недоліки, так як не існує специфікацій, яким повинні підкорятися макромови. Відповідно в загальному випадку у кожного програмованого програми є свій макромова, відмінний від макромов інших програмованих додатків (Відмінністю тут є продукти фірми Microsoft, де в якості макромови вибрано підмножина Visual Basic – Visual Basic for Applications. Прим. ред).

Більш зручною реалізацією програмованість настільних програм було б наявність у них можливості надавати свої сервіси іншим програмам за допомогою універсального механізму, не залежного від вбудованих макромов і що дозволяє, зокрема, використовувати звичайні мови програмування. Саме для цієї мети і призначений механізм, званий автоматизацією (Automation) (Раніше цей механізм називався OLE Automation. Прим. ред). У цьому випадку програма, яка надає той чи інший сервіс, використовує для цієї мети інтерфейси містяться всередині його адресного простору COM-об'єктів, і називається сервером автоматизації. Додаток, що використовує сервіс, називається контролером автоматизації і може бути написано за допомогою переважної більшості сучасних засобів розробки. Відзначимо, що серверами автоматизації є, зокрема, такі популярні програми, як Microsoft Office (Word, Excel, PowerPoint), Seagate Crystal Reports, Microsoft Internet Explorer і навіть сама оболонка Windows 95/98/NT.

У загальному випадку клієнт і сервер знаходяться в різних адресних просторах, і, відповідно, для управління сервером клієнт повинен звертатися до методів об'єктів, що знаходяться в іншому адресному просторі. Для цієї мети використовується технологія LRPC (Local Remote Procedure Calls – локальні виклики віддалених процедур).

Кожен COM-сервер (яким є сервер автоматизації) і кожен клас COM-об'єктів володіє унікальним 128-бітовим ідентифікатором GIUD (Global Unique Identifier). При зверненні до класів COM-об'єктів він іноді називається CLSID (ідентифікатор класу). При створенні COM-серверів (у тому числі і серверів автоматизації) за допомогою C + + Builder GUID і CLSID генеруються автоматично, хоча при необхідності можна згенерувати їх за допомогою виклику стандартної функції Windows API CoCreateGUID. Інформацію про всі COM-серверах і класах COM-об'єктів зберігається в системному реєстрі, що дозволяє клієнту "не знати", в якому каталозі (або на якому комп'ютері локальної мережі) знаходиться COM-сервер.

У загальному випадку COM-сервер являє собою додаток, що створює COM-об'єкт і робить його доступним для інших програм. . Сервер автоматизації надає для доступу об'єкт спеціального типу – dispatch object. При цьому в адресному просторі додатка-контролера, керуючого сервером, присутній варіантна змінна, що містить інтерфейс IDispatch, Що відкриває надає доступ до цього об'єкта на COM-сервері ..

Контролер може керувати сервером, наприклад, ініціюючи його виконання, створення за його допомогою документів та інших об'єктів, зміна розмірів, положення і видимості вікна сервера, копіювання об'єктів сервера в буфер обміну, додавання даних в створений сервером документ, і т.д.. Наявність тих чи інших можливостей управління сервером залежить від того, які об'єкти, властивості і методи сервера надані розробниками сервера для автоматизації за допомогою зовнішніх програм.

Підготовчий етап: створення програми, що підлягає автоматизації

Для створення сервера автоматизації слід створити звичайна програма і потім додати до нього подібний об'ектопісаніе класу COM-об'єктів, створюваних цим додатком, для здійснення доступу до функціональності, яку потрібно автоматизувати.

Розробимо найпростіший сервер автоматизації. З цією метою створимо звичайна програма, наприклад, текстовий редактор, що містить інструментальну панель з чотирма кнопками і компонент TMemo, а також діалогові панелі відкриття і збереження файлу.



Рис. 1. Головна форма майбутнього сервера автоматизації


Створимо обробники подій, пов'язані з натисканням на кнопки, і характерні для текстових редакторів:

 //———————————————— ————–
#include <vcl.h>
#pragma hdrstop

#include “main1.h”
//———————————————— ————–
#pragma package(smart_init)
#pragma resource “*.dfm”
TForm1 *Form1;
//———————————————— ————–
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//———————————————— ————–

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Memo1->Lines->Clear();
}
//———————————————— ————–
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
if (OpenDialog1->Execute())
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
}
//———————————————— ————–
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
if (SaveDialog1->Execute())
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
//———————————————— ————–
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
Close();
}
//———————————————— ————–


Збережемо проект. Відзначимо, що поки створений нами текстовий редактор представляє собою звичайне Windows-програми та не є сервером автоматизації.

Перетворення додатки в сервер автоматизації


Для перетворення створеного нами вище програми в сервер автоматизації виберемо елемент Automation Object зі сторінки ActiveX репозитарія об'єктів:



Рис. 2. Вибір Automation Object з репозитарія об'єктів


Введемо ім'я класу, під яким даний клас COM-об'єктів буде зареєстрований в реєстрі.



Рис. 3. Діалогова панель введення імені класу


Після цього ми опинимося в редакторі бібліотеки типів (Type Library Editor), у якому нам доведеться визначити властивості і методи створеного класу COM-об'єктів.



Рис. 4. Бібліотека типів новоствореного сервера


Бібліотека типів


Що являє собою бібліотека типів і навіщо вона потрібна? По суті, бібліотека типів представляє собою двійковий файл з описом інтерфейсів COM-об'єкта та їх методів.

Зазвичай такі описи створюються за допомогою спеціальної мови IDL (Interface Definition Language) і використовуються для того, щоб розробники знали, як створити код, що реалізовує методи COM-об'єкта (або взагалі методи об'єкта, розташованого за межами адресного простору розробляється, так як IDL використовується не тільки в COM-технології, але і в інших технологіях, що реалізують виклики віддалених процедур або функцій, наприклад, CORBA). Крім цього, опису методів мовою IDL можуть бути використані для автоматичної генерації серверного та клієнтського коду (так званого proxy-коду і stub-коду) за допомогою відповідних утиліт.

З іншого боку, proxy-код і stub-код можуть бути згенеровані динамічно. У цьому випадку клієнт повинен динамічно отримувати інформацію про властивості і методи інтерфейсів COM-об'єкта, і в цьому випадку наявність бібліотеки типів, що містить таку інформацію, може бути вельми зручно. Відзначимо, що бібліотеку типів можна в принципі згенерувати на основі опису мовою IDL за допомогою спеціального компілятора MIDL, але в даному випадку в цьому немає необхідності.

Отже, приступимо до редагування бібліотеки типів. Припустимо, що ми хочемо автоматизувати завантаження файлу у вікно редактора, збереження набраного тексту, очищення вікна редагування, визначення та зміни ширини і видимості вікна. Створимо також метод, який додає рядок до редагованому тексту. З цією метою реалізуемjопішем для нашого сервера методи FileNew, FileOpen, FileSave, AddLine і їх параметри, а також властивості Width і Visible, і опишемо їх параметри.

Відзначимо, що типи даних, що використовуються для опису параметрів методів, не збігаються з типами даних С + +, так як в цьому випадку використовуються типи даних, прийняті в IDL. Найбільш часто використовувані типи даних мови IDL наведені в таблиці 1. Таблиця 1. Найбільш часто використовувані типи даних мови IDL


































Тип даних Опис
short Двухбайтовое ціле число зі знаком
long Чотирьохбайтові ціле число зі знаком
single Чотирьохбайтові дійсне число
double Восьмібайтовое дійсне число
BSTR Двійкова рядок
DATE Дата
VARIANT_BOOL true= -1, false = 0
VARIANT Покажчик на варіантну змінну
int Ціле (розмір в байтах в загальному випадку залежить від розрядності операційної системи)

Докладний список типів даних IDL можна знайти в документації С + + Builder.

Відзначимо також, що поряд з типами даних IDL можна використовувати всі типи даних, визначені в самій бібліотеці типів. а також в інших бібліотеках, на які вона посилається.

Метод FileNew параметрів не має. Методи FileOpen і FileSave мають один рядковий параметр типу BSTR – ім'я файлу. Метод Addline також має один рядковий параметр, що задає додається рядок. Властивість Visible має логічний тип VARIANT_BOOL, при цьому воно може бути як прочитане, так і змінено. Властивість Width має цілий тип int (число пікселів) і також доступний як для читання, так і для запису.

У результаті бібліотека типів придбає приблизно такий вигляд:



Рис. 5. Бібліотека типів сервера автоматизації після опису властивостей і методів об'єкта IDispatch


Створення коду реалізації методів об'єкта автоматизації


Отже, ми описали властивості і методи нашого об'єкта, і тепер повинні приступити до їх реалізації. Для цієї мети слід натиснути кнопку Refresh на інструментальній панелі редактора бібліотеки типів. Після цього буде згенерований ще один модуль з заготовками процедур і функцій, що реалізують ці методи. У ці заготовки слід вписати відповідний код (він показаний виділеним шрифтом):

//————————————————————–
#include <vcl.h>
#pragma hdrstop
#include <atlatlvcl.h>

#include “main3.h”
#include “main1.h”
//———————————————— ————–
#pragma package(smart_init)

STDMETHODIMP TMyAuto3Impl::get_Width(int* Value)
{
try
{
*Value=Form1->Width;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–
STDMETHODIMP TMyAuto3Impl::set_Width(int Value)
{
try
{
Form1->Width=Value;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::get_Visible(VARIANT_BOOL* Value)
{
try
{
*Value=Form1->Visible;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::set_Visible(VARIANT_BOOL Value)
{
try
{
Form1->Visible=Value;
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::NewFile()
{
try
{
Form1->Memo1->Lines->Clear();
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::SaveFile(BSTR Filename)
{
try
{
Form1->Memo1->Lines->SaveToFile(Filename);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::AddLine(BSTR Line)
{
try
{
Form1->Memo1->Lines->Add(Line);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–

STDMETHODIMP TMyAuto3Impl::OpenFile(BSTR Filename)
{
try
{
Form1->Memo1->Lines->LoadFromFile(Filename);
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IMyAuto3);
}
return S_OK;
};
//———————————————— ————–


Скомпіліруем і запустимо сервер на виконання. При цьому він зареєструється в реєстрі.



Рис. 6. Запис про сервер автоматизації в реєстрі Windows


У дійсності в розділах реєстру HKEY_LOCAL_MASHINESOFTWARE і HKEY_CLASSES_ROOT міститься кілька записів, пов'язаних з даним сервером і його інтерфейсами, в тому числі й інформація про місцезнаходження сервера.

Якщо надалі відпаде необхідність у використанні створеного сервера автоматизації, рекомендується запустити його з ключем / unregserver. У цьому випадку відповідні записи будуть видалені з реєстру. Якщо ж виникне необхідність перенести сервер автоматизації в інший каталог, можна після цього просто запустити його знову, і при цьому записи в реєстрі оновлено.

Отже, ми створили настільний додаток, що є сервером автоматизації. Тепер, грунтуючись на інформації про методи класу його об'єкта автоматизації, що міститься в бібліотеці типів, можна створювати додатки, що керують цим сервером, за допомогою досить широкого спектра засобів розробки (що включає Delphi, C + + Builder, Visual Basic, Visual C + + та ін.) Створення контролерів автоматизації буде розглянуто в наступній статті даного циклу.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*