Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования Сpp 25.09.11 (2).doc
Скачиваний:
33
Добавлен:
19.08.2019
Размер:
10.09 Mб
Скачать

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, он неожиданно может увидеть какое-то со-

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