STDMETHODIMP TMyServerlmpl::set_Mess(BSTR Text)




{

Try

{

Forml->Editl->Text = Text;

}

Catch(Exception se)

{

return Error(e.Message.c_str(), IID_IMyServer);

}

return S_OK;

};

STDMETHODIMP TMyServerlmpl::SetVis(VARIANT_BOOL Vis)

{

Forml->Visible = Vis;

return S_OK;

}

Коды функции set_Mess очевиден: в окно Editl записывается текст, передан-

ный в функцию как параметр Text. Реализация функции Set Vis также очевидна:

видимость формы устанавливается равной переданному в функцию булеву пара-

метру Vis. А вот реализация функции get_Mess требует пояснений. Вам надо зане-

сти в переданный по ссылке параметр текст, содержащийся в окне Editl. Этот

текст имеет тип AnsiString, а вам надо преобразовать его в тип BSTR. Приведен-

ный оператор осуществляет это преобразование следующим образом. Сначала с по-

мощью c_str() — функции-элемента класса AnsiString текст преобразовывается

в тип char *. Затем результат преобразования передается в конструктор класса

WideString. В результате получается строка символов Unicode. И, наконец, с по-

мощью c_bstr() — функции-элемента класса WideString строкапреобразовывает-

ся в тип BSTR.

Проектирование сервера закончено. Можете сохранить проект, откомпилиро-

вать и выполнить. В момент запуска сервер автоматически зарегистрируется в сис-

теме: в реестр Windows запишутся его идентификаторы и место размещения файла.

Теперь можно реализовывать клиентское приложение. Начните новый проект

и создайте форму, возможный вариант которой показан на рис. 7.15 а.

Кнопка Принять (BGetMess) должна обеспечивать отображение в окне редакти-

рования Editl текст сообщения, записанного на сервере. Кнопка Послать (BSetMess)

должна обеспечивать передачу текста из окна редактирования на сервер. Кнопка Ви-

димость (BSetVis) должна управлять видимостью сервера в зависимости от состоя-

ния индикатора Видимый (CheckBoxl). Ниже приведен возможный вариант кода

клиентского приложения.

Variant Serv;

void fastcall TForml::FormCreate(TObject *Sender)

f

Serv = CreateOleObject("Projectl.MyServer");

)/

/

void fastcall TForml::BGetMessClick(TObject *Sender)

(

Editl->Text = Serv.OlePropertyGet("Mess");

)

//

void fastcall 'TForml::BSetMessClick(TObject *Sender)

Процессы, потоки, распределенные приложения 489

Serv.OlePropertySet("Mess",

WideString((Editl->Text).c_str()).c_bstr ());

}

/ /

void fastcall TForml::BSetVisClick(TObject ≪Sender)

{

Serv.deprocedure("SetVis", CheckBoxl->Checked);

}

В приложении вводится глобальная переменная Serv — объект сервера. Тип

этой переменной — Variant. Первая процедура приведенного кода FormCreate яв-

ляется обработчиком события OnCreate формы. В этой процедуре функцией

CreateOleObject в Serv создается объект OLE интерфейса, по которому можно свя-

зываться с сервером. Имя сервера и его объекта передается в CreateOleObject в ка-

честве параметра. Все необходимые операции по связи с сервером выполняются ав-

томатически. Если в данный момент сервер не выполняется, он будет запущен на

выполнение. Если же сервер уже работает, то с ним будет установлена связь.

Функция BGetMessClick читает сообщение с сервера в окно Editl. Для досту-

па к значению свойства Mess используется функция OlePropertyGet. В качестве

параметра в нее передается строка с именем читаемого свойства. Функция BSet-

MessClick посылает на сервер в свойство Mess текст из окна Editl. Делается это

с помощью функции OlePropertySet. Первым параметром в эту функцию переда-

ется строка с именем свойства, значение которого надо установить. Вторым пара-

метром передается устанавливаемое значение. В данном случае осуществляется

уже рассмотренное при проектировании сервера преобразование типа AnsiString

в тип BSTR.

Функция BSetVisCHck выполняет метод SetVis сервера. Для выполнения ме-

тода используется функция OleProcedure. В качестве первого параметра в нее пе-

редается строка с именем вызываемого метода. А последующие параметры содер-

жат значения параметров метода. В нашем случае надо передать только один пара-

метр — булеву величину CheckBoxl—>Checked, указывающую, должен ли сервер

бытьвидимым, или нет.

Сохраните проект и выполните его. Вы увидите, что при этом автоматически за-

пустится сервер, и клиент сможет им управлять: заносить в него свои сообщения,

принимать сообщения, записанные в окне сервера, устанавливать видимость серве-

ра. Как только вы закроете клиентское приложение, сервер тоже завершит работу.

Чтобы полностью уяснить взаимодействие сервера и клиентов, запустите сред-

ствами Windows несколько экземпляров клиентский приложений. Вы увидите, что

все они работают с одним экземпляром сервера и могут обмениваться через него со-

общениями. Если вы закроете один экземпляр клиента, сервер продолжит работу.

Его работа завершится только после того, как будет закрыт последний клиент.

Можете провести еще один эксперимент, который покажет, как регистрирует-

ся сервер. Перенесите средствами Windows исполняемый файл сервера Projectl.exe

в какой-то другой каталог. При попытке выполнить клиентское приложение будет

выдано сообщение об ошибке: ≪Не удается найти указанный файл≫. Это естествен-

но, так как в реестре записан каталог, в котором должен находиться сервер, а те-

перь в этом каталоге нужного файла нет. Но достаточно один раз выполнить при-

ложение сервера из нового каталога, и его работоспособность восстановится. Сер-

вер опять зарегистрируется в системе и теперь клиенты, расположенные в любых

каталогах, смогут с ним связываться.

Проведенный эксперимент показал не только особенности регистрации серве-

ра, но и определенные недостатки нащего клиентского приложения. Оно не застра-

ховано от сбоев. Один из сбоев вы видели при попытке запустить незарегистриро-

ванный или неправильно зарегистрированный сервер. Другой сбой наступит, если

клиент связан с сервером, а в это время кто-то этот сервер закрыл. Правда, при по-

пытке закрыть сервер вы увидите окно с предупреждением на английском языке,

490 _ Глава 7

смысл которого состоит в том, что еще имеются клиенты, работающие с данным

сервером, и закрытие сервера нарушит их работу. Но если, несмотря на это преду-

преждение, вы закроете сервер, то при последующем обращении клиента к его

свойствам и методам получите сообщение об ошибке: ≪Сервер RPC недоступен≫.

Желательно предусмотреть в клиентском приложении обработку соответст-

вующих исключений. Ниже приведен исправленный код двух из рассмотренных

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

void _ fastcall TForml:: FormCreate (TObject *Sender)

{

try

{

Serv=Create01eObject ("Projectl.MyServer");

}

catch (Exception &)

{

ShowMessage ("He удалось соединиться с сервером ' Projectl.MyServer ' ");

void _ fastcall TForml::BGetMessClick (TObject *Sender)

{

try

{

Editl->Text = Serv.OlePropertyGet ("Mess");

}

catch (Exception &)

{

ShowMessage ("Сервер ' Projectl.MyServer ' недоступен");

В заключение надо сказать, что вы реализовали и сервер, и клиента в рамках

одной системы — C++Builder и на одном языке — C++. Но в том и состоит досто-

инство технологии СОМ, что она не зависит от языка. Если на вашем компьютере

есть какие-то иные системы, поддерживающие COM (Delphi, Visual Basic и т.п.), то

вы можете, например, реализовать с их помощью сервер, и ваше клиентское при-

ложение без проблем будет работать с ним. Или наоборот, клиенты, реализован-

ные в любой другой системе программирования, смогут работать с сервером, реа-

лизованным с помощью C++Builder.

Мы рассмотрели создание клиентского приложения для сервера, который соз-

давали сами. Аналогичным образом можно создавать приложения, работающие

с любыми серверами автоматизации, имеющимися на вашем компьютере. Единст-

венный вопрос, возникающий при этом, — откуда получить информацию об объ-

ектах, свойствах и методах, экспонируемых сервером?

Обычно эта информация содержится в справках соответствующего сервера.

В частности, в офисных приложениях Microsoft эти сведения содержатся в справках

по языку программирования VBA. А в общем случае подобную информацию, прав-

да, без комментариев, но зато более достоверную, можно получить из библиотеки

типов сервера. Для этого выполните команду File | Open, укажите в открывшемся

диалоговом окне тип открываемых файлов Type Library, найдите и откройте, напри-

мер, библиотеку типов программы Word. Имя соответствующего файла зависит от

версии вашего Microsoft Office, но обычно оно имеет вид ≪MSWord*.olb>>. Файл рас-

положен в одном из подкаталогов каталога Program Files\ Microsoft Office.

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

вам окно Редактора Библиотеки Типов, в которой увидите полную информацию об

объектах сервера Word, его интерфейсах, свойствах и методах. А далее вы все это

можете использовать для построения приложения, применяя рассмотренные выше

функции CreateOleObject, OlePropertyGet, OlePropertySet, OleProcedure.

Процессы, потоки, распределенные приложения 491

Правда, для приложений Microsoft Office это вряд ли имеет смысл использо-

вать. Гораздо удобнее и надежнее реализовывать клиентов офисных приложений

Microsoft с помощью специальных компонентов, которые рассмотрены в разд. 7.9.

Кроме того, учтите, что ваше приложение, успешно работающее с какой-то верси-

ей сервера, перестанет работать при появлении новой версии Microsoft Office. На-

пример, приложения, работающие в Windows 98, не работают в Windows XP.

 

Правда, для приложений Microsoft Office это вряд ли имеет смысл использо-

вать. Гораздо удобнее и надежнее реализовывать клиентов офисных приложений

Microsoft с помощью специальных компонентов, которые рассмотрены в разд. 7.9.

Кроме того, учтите, что ваше приложение, успешно работающее с какой-то верси-

ей сервера, перестанет работать при появлении новой версии Microsoft Office. На-

пример, приложения, работающие в Windows 98, не работают в Windows XP.

7.8.4 Элементы ActiveX

Спецификация ActiveX является составной частью технологии СОМ. Элемен-

ты ActiveX оформляются в виде файлов.осх, регистрируются в реестре Windows и

затем могут использоваться в программах, написанных на различных языках с ис-

пользованием различных систем (Visual Basic, PowerBuilder, Delphi), а также

в приложениях, работающих с Интернет (см. гл. 12).

Надо сказать, что в любой поставке Windows имеется множество элементов

ActiveX, реализующих различные кнопки, списки, окна редактирования и т.п.

Так что создавать новый элемент ActiveX имеет смысл только в том случае, если

он реализует какие-то специфические функции, требуемые ряду пользователей ва-

шей организации. Причем создавать элемент именно как ActiveX следует только

в тех случаях, если он должен встраиваться в другие приложения, разработанные

не на C-H-Builder. В частности, элементы ActiveX, как будет показано далее, могут

встраиваться в такие офисные приложения Microsoft, как Word, Excel и др. Могут

они использоваться также в составе страниц Web.

Рассмотрим простой пример создания элемента ActiveX. Конечно, реально

надо предварительно разработать свой новый компонент, реализующий требуемые

функции, а затем оформлять его как ActiveX. Создание собственных компонентов

рассмотрено в разд. 8.3. А пока попробуем оформить в виде ActiveX стандартный

компонент C++Builder MonthCalendar (см. разд. 3.3.3). Это будет просто тестовый

пример, так как в составе Windows имеется свой календарь ActiveX. Но забудем об

этом, будем считать, что его нет, а он нужен нам для различных целей, в частно-

сти, для использования в Word.

Закройте текущие проекты, выполнив команду File CloseAII. Теперь выполните

команду File | New | Other и на странице ActiveX выберите пиктограмму ActiveX Control.

Отметим, что возможен и другой вариант начала создания элемента ActiveX: снача-

ла создается пиктограммой ActiveX Library библиотека типов, а затем выбирается пик-

тограмма ActiveX Control. В любом случае перед вами откроется окно, показанное на

рис. 7.16. В выпадающем списке VCL Class Name вы можете выбрать элемент VCL

(стандартный, или созданный вами), который хотите оформить как ActiveX. В на-

шем примере надо выбрать класс TMonthCalendar. В трех окнах, расположенных

ниже списка, автоматически появятся имена файлов, описывающих создаваемый

элемент. Можете при желании изменить их, но вряд ли в этом есть необходимость.

Рис. 7.16

Окно задания характеристик элемента ActiveX VCL Class Name: jTMonlhCalendai [CornCtrls

Hew ActiveX Name: JMonlhCalendorX

Implementation Unit: jMonthCalendatlmpH xpp

EroiectName: JMonthCalendatXControll.cpp

" ActiveX Conliol Options

Г" Make Control Licensed

Г" Include yeision Information

1 ~QK~

Г Include About В ox

492 Глава 7

Индикатор Make Control Licensed обеспечивает генерацию лицензионного файла

.lie. Если вы включите этот индикатор, то вашим элементом ActiveX потребители

смогут пользоваться, только если он включен в переданный им завершенный про-

ект. А использовать элемент в каких-то свих разработках они смогут, только если

приобретут у вас соответствующую лицензию и получат копию файла.lie. Индика-

тор Include Version Information обеспечивает включение в результирующий файл.осх

информации о версии (см. раздел 2.3.5). Индикатор Include About Box обеспечивает

включение в проект дополнительной формы с информацией об элементе и его авто-

рах. Эту форму сможет видеть разработчик, использующий ваш элемент в ка-

ких-то своих разработках.

Заполнив необходимую информацию, щелкните на кнопке ОК. C++Builder

создаст все необходимые файлы, включая библиотеку типов, которая неоднократ-

но рассматривалась в предыдущих разделах. Если требуется, можете что-то в ней

изменить. Если нет — то сохраните сгенерированные файлы и выполните команду

Run | Register ActiveX server, чтобы зарегистрировать ваш элемент в реестре Windows.

Если вы в дальнейшем надумаете снять элемент с регистрации, надо будет выпол-

нить команду Ron | Unregister ActiveX Server.

Все операции, необходимые для создания элемента ActiveX и его регистрации,

выполнены. Как видите, все свелось к нескольким щелчкам мыши. Теперь вы мо-

жете использовать элемент в любых разработках. В качестве примера, давайте по-

пробуем использовать его в программе Word. Это означает, фактически, проверку

вашего компонента в проекте на языке Visual Basic.

Пусть вы хотите создать в Word макрос, который вызывал бы форму, содержа-

щую ваш календарь и три кнопки. При щелчке на первой из них в текущую пози-

цию курсора в документе Word должна заноситься дата, которую вы выбрали в ка-

лендаре. При щелчке на второй кнопке в документ должно заноситься число дней

от текущей даты до даты, выбранной в календаре. А щелчок на третьей кнопке

должен закрывать форму с календарем.

Операции, необходимые для создания подобного макроса, несколько различа-

ются в различных версиях Word. Я буду описывать операции, выполняемые

в Word 2002, включенном в Windows XP. Описание будет кратким, так как рас-

смотрение работы с Word и с языком VBA, конечно, лежит за пределами тематики

данной книги.

Выполните в Word команду Сервис | Макрос | Макросы. В открывшемся окне

введите имя создаваемого макроса (например ≪Календарь≫) и щелкните на кнопке

Создать. Вы попадете в окно Редактора Microsoft Visual Basic (см. рис. 7.17).

Выделите в окне Project вершину шаблона Normal, щелкните правой кнопкой

мыши и выберите во всплывшем меню раздел Insert | UserForm. Появится форма и

панель ToolBox (справа вверху на рис. 7.17) с компонентами, которые можно разме-

щать на форме. Конечно, сначала в этой панели не будет компонента вашего ка-

лендаря.

Щелкните на ToolBox правой кнопкой мыши и выполните команду Additional

Controls. Появится список всех зарегистрированных элементов ActiveX. Включите

индикатор у MonthCalendarX. Соответствующая пиктограмма появится на панели

ToolBox. Разместить компонент на форме. В окне Property можно изменить какие-то

его свойства.

Назовите вашу форму FCalendar (свойство Name формы). Перенесите на фор-

му с панели ToolBox три кнопки, расположите их примерно так, как показано на

рис. 7.17, измените надписи на них (свойство Caption), полезно также задать их

свойства ControlTipText — надписи всплывающих ярлычков, позволяющие поль-

зователю ориентироваться в назначении кнопок формы.

Сделайте поочередно двойные щелчки на кнопках и в появившихся заготов-

ках обработчиков напишите соответствующие операторы языка Visual Basic. В ре-

зультате код процедур будет иметь вид:

Процессы, потоки, распределенные приложения 493

Private Sub CommandButtonl_Click()

Selection = MonthCalendarXl.Date

End Sub

Private Sub CommandButton2_Click()

Selection = MonthCalendarXl.Date - Date

End Sub

Private Sub CommandButton3_Click()

End

End Sub

Сделайте в окне Project двойной щелчок на вершине создаваемого макроса (на

рис. 7.17 я назвал эту вершину ≪MyCalendar≫) и в открывшемся окне заготовки

кода вашего макроса добавьте единственный оператор (см. на рис. 7.17):

FCalendar.Show (modeless)

делающий форму видимой и не модальной (это задается параметром modeless). По-

следнее желательно, чтобы пользователь мог свободно переключаться между ок-

ном документа и формой. Впрочем, если у вас Microsoft Office 97 или младше,

форму нельзя сделать не модальной.

Рис. 7.17

Окно Редактора Microsoft Visual Basic

Сохраните созданный макрос, протестируйте его (кнопка Run Sub/UserForm — де-

вятая справа на рис. 7.17) и закройте редактор Visual Basic. Теперь для облегчения

работы пользователя желательно задать вашему макросу какие-то горячие клави-

ши. Для этого надо выполнить в Word команду Сервис | Настройка, в открывшемся

окне щелкнуть на кнопке Клавиатура, в открывшемся окне в списке Категории вы-

брать раздел Макросы, затем в панели Макросы выбрать ваш макрос Календарь, пе-

рейти в окно Новое сочетание клавиш, нажать желательные клавиши (например,

Orl-Alt-C), щелкнуть на кнопке Назначить и затемна кнопке Закрыть. Все это я изло-

жил скороговоркой, так как думаю, что вы и сами все это прекрасно знаете.

Теперь можете испытать макрос, использующий ваш элемент ActiveX. От-

кройте в Word документ, напишите какой-то текст и нажмите клавиши Ctrl-Alt-C.

Вы увидите спроектированную вами форму (рис. 7.18). Выбирая в календаре дату

и нажимая соответствующую кнопку вы сможете заносить в текущую позицию

курсора выбранную дату или число дней между этой и текущей датой. В некото-

494 Глава 7

рых ситуациях подобный макрос может быть полезен, если часто приходится рас-

считывать интервалы между различными датами. К тому же, очень легко услож-

нить ваш элемент ActiveX и внести с помощью его библиотеки типов новые полез-

ные вам свойства и методы.

Рис. 7.18

Пример применения макроса,

использующего элемент ActiveX

риянптвиц

£айл Главка ВИД бсг^вка

О & О М sal <Ы: <Э V

.$ Сбьмньм ч- Пер -: Aral

Сегодня 20.03.2002. Я должен к 30.04.2002, т.е.

через 41 день, закончить книгу.

11 12 13 14 15 16 17

1В 19 iffift 21 22 23 24

25 26 27 28 29 30 31

<1; Сегодня: 20.03.2002

5JS ≪-

Стр.:1 Ст 2 Кол 32

Мы рассмотрели создание элементов ActiveX. Теперь рассмотрим включение

в ИСР C++Builder элементов ActiveX, разработанных вами, или заимствуемых из

тех, которые поставляются с Windows, или полученных где-то на стороне.

Выполните команду Component | Import ActiveX Control. Перед вами откроется

окно, представленноена рис. 7.19. Вверху окна расположен список всех зарегист-

рированных в системе элементов. Если вам требуется установить новый, еще не за-

регистрированный элемент, нажмите кнопку Add и в открывшемся окне найдите

файл.осх устанавливаемого элемента.

Если вы выделите в списке какую-то строку, под списком вы увидите полное

имя соответствующего файла.осх, а в окне Class names появится имя класса или

нескольких классов, реализуемых данным элементом. Выпадающий список Palette

page позволяет выбрать или задать новую страницу палитры компонентов, на ко-

торую будет установлен компонент. Окно Unit dir name содержит каталог модулей,

использующих компонент ActiveX. Окно Search path содержит список путей, ис-

пользуемых при поиске файлов.

Рис. 7.19

Окно импорта элемента ActiveX frnpcft ActiveX I

i (Microsoft Outlook View Control [Version 1.0) ~"лГ| '

i Microsoft Scrip* Control 1.0 (Veision 1.0)

Microsoft Shell Controls And Automation (Version 1.0)

\ Microsoft Terminal Services Active Gent 1.0 T>pe Library (Versicr-— J:

! Microsoft TV CA Type Library (V≪sion 1.0)

Microsoft Windows Common Controls 6.0 (Version 2-0]

1 • FAT estA".rrii'ft<\Mon!iCalendai'.ocx

•: pass names: ffMonthCaleTid^X

;. I

: galettepage: (ActiveX

; Uni. & name: JDAPfogramFib^orb

Search path: j$(eCB]\Lib;$lBCi3ABin

Install... | [ CfeateLjnit

Add..: fiemove 1

^≪uu≫6M4x≫irt _.J;

t(8CB)\lmporltt[BCB)\ A

1 Cartel j JlelP |

Процессы, потоки, распределенные приложения 495

Кнопка Create unit создает и открывает в окне Редактора Кода модуль элемен-

та. При этом модуль не включается в текущий проект.

Кнопка Install (установка) открывает окно, в котором запрашивается имя имею-

щегося или нового пакета, в который должен устанавливаться регистрируемый

компонент. Далее открывается окно Редактора Пакетов, работа с которым подробно

описана в гл. 8. В этом окне вы можете произвести установку компонента. В резуль-

тате компонент появится в палитре компонентов на той странице, которая была

указана в окне 7.19. Теперь вы можете использовать его в своих проектах.

7.9 Компоненты-серверы СОМ

7.9.1 Компоненты-серверы СОМ в C++Builder 6 и 5

Начиная с C++Builder 5, взаимодействие с Word, Excel и многими другими

распространенными программами, входящими в стандартную установку Word и

Microsoft Office, может осуществляться из приложений C++Builder с помощью

компонентов, размещенных в библиотеке на странице Office2k, или Office97, или

Servers. Эти компоненты отображают множество импортируемых серверов СОМ.

Все они являются потомками своего базового класса TOleServer. В этом классе

объявлены абстрактные методы и свойства, позволяющие устанавливать связь

с сервером. Поэтому объекты класса TOleServer нельзя создавать непосредствен-

но. В приложениях используются только потомки этого Класса — конкретные сер-

веры СОМ. Они создаются импортом библиотек типов, с которым вы уже знакомы

по предыдущим разделам.

Но прежде, чем рассматривать серверы СОМ, обеспечивающие работу с компо-

нентами Microsoft Office, надо обсудить вопросы совместимости с различными вер-

сиями Windows и Microsoft Office. Когда вы устанавливаете C++Builder 6, вам за-

дается вопрос, для какой версии Office — 2000, или 97 надо проводить установку.

В зависимости от того, какой вариант вы выбрали, в палитре компонентов появит-

ся страница ОН1се2!<;.или Office97, на которой будут располагаться компоненты сер-

веров. В последующим вы можете при желании в любой момент изменить сделан-

ный выбор. Для этого надо выполнить команду Component | Install Packages. Вы уви-

дите окно, представленное на рис. 7.20. Это окно позволяет управлять набором ис-

пользуемых пакетов. Подробнее работа с этим окном рассмотрена в гл. 8, в разд.

8.5. А сейчас ограничимся описанием тех операций, которые надо сделать для из-

менения установленного в системе пакета.

Рис. 7.20

Страница установки пакетов в окне

опций проекта

х]

Packages |

/ Borland ActionBar Components

У! Borland ADO DB Components

V'i Bwland Base Cached ClientDalasel Component

У\ BoilandBDE DB Components

/; Borland C++Builder COM Server Components jampje Package^

DAProgiam Files\Bo(hnd\CButlder6\BinNbcb97ax$ervef60.bpl

Add.., Remove

Runtime packages

: Г Build with runtime packages

Г Default Cancel Help

496 Глава 7

Вам надо найти в списке Design packages строку, в которой в виде комментария

написано ≪Borland C-H-Builder Server Components Sample Package≫ (см. рис 7.20) и

выключить индикатор в этой строке. Тем самым вы снимете соответствующий пакет

с регистрации в системе. Затем надо щелкнуть кнопку Add и добавить вместо от-

ключенного новый пакет. Пакеты размещаются в каталоге CBuilder6\Bin и имеют

имена bcb2kaxserver60.bpl для Office 2000/XP и bcb97axserver60.bpl для Office 97/98.

В зависимости от того, какой из этих пакетов у вас подключен (имя пакета вы мо-

жете видеть в строкепод списком Design packages — см. рис. 7.20), добавьте недос-

тающий.

Подобную операцию надо осуществить только один раз. В дальнейшем для

смены пакета вы просто выключаете индикатор используемого пакета, и затем

включаете индикатор другого.

В зависимости от того, какой пакет вы используете, в заголовочный файл ва-

шего приложения будет добавлена директива

Hnclude "Word_2K_SRVR.h"

ИЛИ

≪include "Word_97_SRVR.h"

а в файл реализации добавится директива

#pragma link "Word_2K_SRVR"

ИЛИ

#ргадта link "Word__97_SRVR"

Надо отметить, что свойства и методы одинаковых компонентов могут не-

сколько различаться в разных пакетах. Так что переход от одного из них к друго-

му требует в ряде случаев некоторых изменений в программе.

Все сказанное выше относилось к C++Builder 6. В C++Builder 5 имеется толь-

ко один пакет, и все компоненты-серверы СОМ размещаются на странице библио-

теки Servers. Так что в C++Builder 5 никакой путаницы с пакетами возникнуть не

может. В то же время надо отметить, что свойства и методы компонентов-серверов

СОМ в C++Builder 5 и 6 существенно различаются. Так что при переходе от

C++Builder 5 к C++Builder 6 приходится перепрограммировать приложения, ис-

пользующие серверы СОМ.

Теперь надо обсудить вопросы совместимости приложений, разработанных на ос-

нове серверов СОМ, с различными версиями Windows и Microsoft Office. Независимо

от того, какой пакет вы использовали при разработке приложения в C++Builder 6,

выполняемый модуль, как правило, будет нормально работать в Windows 2000/XP.

Но при последующем выполнении его в среде Windows 98 с Microsoft Office 98 воз-

никнут проблемы. Приложение будет требовать библиотеку CC3260MT.dll. Для того

чтобы приложение нормально выполнялось, потребуется записать файл этой библио-

теки (он расположен в каталоге CBuilder6\Bin) в системную папку System. После этого

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

Так что при распространении приложения с серверами СОМ, разработанного

в C++Builder 6, могут возникать некоторые проблемы. Как ни странно, проблем не

возникает с аналогичными приложениями, разработанными в C++Builder 5. Эти

приложений безо всяких проблем выполняются в Windows 98/2000/XP с Office

98/2000/ХР.

В заключение этого предварительного обзора проблем совместимости надо ска-

зать, что приложения с серверами СОМ нормально выполняются на чистых уста-

новках Microsoft Office. Если же на компьютере имеются какие-то прикладные

программы, не очень грамотно вмешивающиеся в офисные продукты Microsoft,

изменяющие их меню и системы команд, то при выполнении ваших приложений

с серверами СОМ могут возникать определенные сложности. Так что переноси-

мость подобных приложенийвсе-таки ограничена.

Процессы, потоки, распределенные приложения 497

Компоненты-серверы СОМ слабо документированы во встроенной справке

C++Builder. Хотелось бы хотя бы частично восполнить этот пробел. Но поскольку

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

серверы страниц Office2k, Office??, Servers, ограничимся только серверами, обеспе-

чивающими связь с Word.

Откройте новое приложение, перенесите на форму компонент WordApplication

и посмотрите в Инспекторе Объектов его свойства. Их очень немного. Кроме

обычных для всех компонентов Name и Tag имеется всего 4 свойства (во многих

компонентах-серверах их всего 3).

Свойство AutoCoimect определяет, должен ли сервер автоматически загру-

жаться с началом выполнения приложения. Если установить AutoConnect = true,

то соединение с сервером произойдет в момент начала выполнения вашего прило-

жения. Если же оставить значение AutoConnect = false, принятое по умолчанию,

то соединение с сервером можно установить вызовом метода Connect. Например:

WordApplicationl->Connect();

Впрочем, совершенно не обязательно устанавливать соединение свойством

AutoConnect или методом Connect. Соединение автоматически устанавливается,

когда выполняется вызов какого-то метода сервера или задается значение како-

му-то его свойству.

При использовании свойства AutoConnect надо иметь в виду, что установка

в true влияет только при запуске приложения, т.е. если это свойство установлено

во время проектирования. Задание AutoConnect = true во время выполнения при-

ложения ни на что не влияет.

Свойство ConnectKind определяет, как именно осуществляется соединение

с сервером. Это свойство может принимать следующие значения:

ckRunningOrNew

ckNewInstance

ckRunninglnstance

ckRemote

ckAttachToInterface

Подсоединиться к выполняющемуся серверу или создать

новый экземпляр сервера.

Всегда создавать новый экземпляр сервера.

Только подсоединиться к выполняющемуся серверу.

Подсоединиться к удаленному серверу. Эта опция должна

сочетаться с заданием свойства RemoteMachineName.

Не подсоединяться к серверу. Вместо этого приложение

обеспечивает интерфейс методом ConnectTo (об этом ме-

тоде будет сказано позднее). Опция ckAttachToInterface

не может использоваться совместно с установкой в true

свойства AutoConnect.

По умолчанию значение ConnectKind равно ckRunningOrNew. При этом если

в момент соединения имеется выполняющийся сервер (применительно к Word-

Application — если Word открыт), то приложение соединится именно с этим вы-

полняющимся экземпляром сервера. Если же в этот момент соответствующий сер-

вер не выполняется, то будет создан новый экземпляр сервера (в нашем случае бу-

дет осуществлен запуск Word).

Если значение ConnectKind равно ckRunningOrNew, то приложение всегда

создает новый экземпляр сервера. Если значение ConnectKind равно ckRunninglnstance,

то приложение всегда соединяется с выполняющимся сервером. В этом

случае, если выполняющегося сервера нет, будет сгенерировано исключение EOle-

SysError. Поэтому при ConnectKind = ckRunninglnstance, если нет уверенности,

что в момент соединения на компьютере имеется выполняющийся сервер, соедине-

ние надо осуществлять, например, так:

Try

(

WordApplicationl->Connect();

}

catch (E01eSysError&)

{

Application->MessageBox(

"На компьютере нет выполняющегося в данный момент Word",

"Приложение будет закрыто",

MBJDK + MB_ICONEXCLAMATION);

Application->Terminate();

}

Приведенный код перехватывает исключение EOleSysError и выдает пользо-

вателю соответствующее сообщение.

Значение ConnectKind = ckRemote используется, если надо связаться с уда-

ленным сервером. В этом случае свойство RemoteMachineName должно указывать

компьютер, на котором выполняется удаленный сервер.

Таким образом, итог рассмотрения свойств, обеспечивающих подключение

к серверу, можно подвести следующим образом:

• Если вам надо, чтобы ваше приложение работало с каким-то открытым доку-

ментом сервера, выполняющимся в момент запуска приложения, следует за-

дать ConnectKind = ckRunninglnstance.

• Если, наоборот, вам надо, чтобы ваше приложение не испортило случайно ка-

кой-то документ в уже выполняющемся сервере, следует задать ConnectKind =

CkNewInstance.

• Если вам необходимо связаться с удаленным сервером, надо задать Connect-

Kind = ckNewInstance и установить соответствующее значение RemoteMachineName.

• В остальных случаях, вероятно, целесообразно сохранять заданное по умолча-

нию значение ckRunningOrNew.

Мы не рассмотрели пока значение ConnectKind равное ckAttachToInterface.

Для таких серверов, как WordApplication, оно не применимо. Его мы рассмотрим

несколько позднее.

После того, как вы установили соединение с сервером, он еще не становится

видимым пользователю. Впрочем, приложение может работать с этим сервером,

вызывать любые его методы, изменять или читать свойства, но сам сервер останет-

ся для пользователя за кадром. Если это нежелательно, если требуется, чтобы

пользователь видел, что происходит на сервере, или мог бы сам переключиться на

сервер и что-то там сделать, то надо задать свойству Visible сервера значение true.

Это делается по-разному в C+4-Builder 6 и 5. В C++Builder 5 это свойство устанав-

ливается непосредственно:

. WordApplicationl->Visible = true; // В C++Builder 5

А в C++Builder б свойство Visible, как и большинство других, доступно толь-

ко для чтения и может устанавливаться только специальными функциями. Для

Visible это функция set_Visible, в которую в качестве аргумента передается

true — сделатьвидимым, или false — сделать невидимым. Например:

WordApplicationl->set_Visible(tr,ue); // В C++Builder 6

Разрыв соединения с сервером осуществляется методом Disconnect. Кроме

того, у таких компонентов серверов СОМ, как WordApplication, имеется свойство

AutoQuit. Если установить это свойство в true, то при завершении приложения ав-

томатически вызовется метод, завершающий сервер. Это свойство полезно уста-

навливать в true, если вы работаете с новым экземпляром сервера, который созда-

ло ваше приложение, и после завершения приложения не требуется, чтобы пользе-

Процессы, потоки, распределенные приложения 499

ватель мог продолжать работу с сервером. Тогда можно или установить AutoQuit

в true, или при завершении приложения выполнить оператор вида:

WordApplicationl->Disconnect();

Это особенно необходимо, если в процессе работы вашего приложения с серве-

ром пользователь не сделал сервер видимым. Если вы не закроете соединение, то

после завершения вашего приложения сервер будет по-прежнему невидим, не бу-

дет отображен в полосе задач, но в действительности будет выполняться. И когда

пользователь решит закрыть Windows, он неожиданно может увидеть какое-то со-

общение вашего сервера-невидимки, например, запрос о сохранении файла.

7.9.2 Свойства и методы сервера Word

Теперь очень коротко рассмотрим объекты, метода и свойства сервера Word.

Его описание, как правило, можно найти во встроенной справке Word. Изложение

в справке ведется на основе языка Visual Basic, а для младших версий Word — на

подмножестве этого языка WordBasic. Конечно, рассмотреть в рамках данной кни-

ги даже основы описания Word как объекта невозможно. Поэтому ниже изложены

только некоторые начальные сведения, впрочем, достаточные для разработки мно-

гих приложений, обращающихся к Word.

Обращение к свойствам объекта WordApplication, инкапсулирующего объект

Application (этот объект является самим выполняющимся экземпляром Word),

производится так же, как к свойствам любого объекта C++Builder. Например,

в Application имеется свойство Options — опции, являющееся в свою очередь объ-

ектом со множеством свойств. Среди этих свойств есть CheckSpellingAsYouType и

CheckGrammarAsYouType — булевы свойства, указывающие, должен ли Word ав-

томатически проверять синтаксис и грамматику и отмечать в тексте ошибки. Та-

кая проверка замедляет работу Word. Если вы хотите отключить в сервере эти ав-

томатические проверки, введите в приложение операторы:

WordApplicationl->Options->CheckSpellingAsYouType = false;

WordApplicationl->Options->CheckGrammarAsYouType = false/-

Тем самым вы отключите автоматические проверки, тем более что в случае, если

Word невидим и работает ≪за кадром≫, эти проверки совершенно бессмысленны



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: