// Программа 8.2
1 #include
2 #include
3 #include «adding_machine_impl.h» 4
5 6 7
8 int main(int argc, char *argv[])
9 {
10 CORBA::ORB_var Orb = CORBA: :ORB_init(argc,argv,«mico-local-orb»);
11 CORBA::BOA_var Boa = Orb->BOA_init(argc,argv,«mico-local-boa») ;
12 adding_machine_impl *AddingMachine =new adding_machine_impl;
13 CORBA::String_var Ref = Orb->object_to_string(AddingMachine);
14 ofstream Out(«adding_machine.objid»);
15 Out « Ref « endl;
16 Out.close() ;
17 Boa->impl_is_ready (CORBA: : ImplementationDef : :_nil () ) ;
18 Orb->run();
19 CORBA: :release(AddingMachine) ;
20 return(0);
21 } 22 23
Обратите внимание на то, что программа-«изготовитель» также должна инициализировать объект Orb(в строке 10). Это — одно из важных требований, предъявляемых к CORBA-ориентированным программам, поскольку каждая программа реализует взаимодействие с удаленными объектами с помощью ORB-брoкepa. Именно поэтому инициализация ORB-объекта— первое действие, которое должна выполнить CORBA-программа. В строке 12 объявляется реальный объект adding_machine . Это именно тот объект, с которым в действительности связывается программа 8.1. В строке 13 объектная ссылка на реальный объект adding_machine преобразуется в «строковую» форму, а затем записывается в обычный текстовый файл, чтобы ее можно было без труда прочитать. После того как IOR-ссылка записана в файл, объект Orb ожидает запроса. При каждом вызове одного из его методов этот объект выполняет соответствующее арифметическое действие (сложение или вычитание). Значение результата передается посредством вызова метода result() объекта adding_machine. Программы 8.1 и 8.2 демонстрируют базовую структуру, которую должны иметь CORBA-программы. Код, создающий объект adding_machine, начинается с объявления его CORBA-класса. Каждый CORBA-объект начинается как IDL-проект (Interface Definition Language — язык описания интерфейсов).
Язык описания интерфейсов (IDL):более «пристальный» взгляд на CORBA-объекты
Язык описания интерфейсов (IDL) — стандартный язык объектно-ориентированного проектирования, который используется для разработки классов, предназначенных для распределенного программирования. Он применяется для отображения интерфейса класса и отношений между классами, а также для определения прототипов функций-членов, типов параметров и типов значений, возвращаемых функциями. Одно из основных назначений языка IDL — отделить интерфейс класса от его реализации. Но дл я определени я самих функций-членов и членов данных IDL не используетс я. Язык IDL определ я ет только интерфейс функции. Основные ключевые слова IDL перечислены в табл. 8.1.
Таблица8.1. |
Ключевые слова IDL |
|
|
abstract |
enum |
native |
struct |
any |
factory |
Object |
supports |
attribute |
FALSE |
octet |
typedef |
boolean |
fixed |
oneway |
unsigned |
case |
float |
out |
union |
char |
in |
raises |
ValueBase |
const |
inout |
readonly |
valuetype |
cell |
interface |
sequence |
void |
double |
long |
short |
wchar |
exception |
module |
string |
|
Ключевые слова, перечисленные в табл. 8.1, представл я ют собой зарезервированные слова, используемые в CORBA-программах. Помимо определени я интерфейса функций дл я класса, я зык IDL используетс я дл я определени я отношений между к л ассами. IDL под д ерживает:
• типы, определенные пользователем;
• последовательности, определенные пользователе м;
• типы массивов;
• рекурсивные типы;
• семантику исключений;
• модули (по аналогии с пространствами имен);
• единичное и множественное наследование;
• поразрядные арифметические операторы.
Приведем IDL-определение для класса adding_machine из листинга 8.2:
interface adding_machine{
void add(in unsigned long X);
void subtract(in unsigned long X);
long result();
}
Это определение начинается с ключевого слова CORBA interface. Обратите внимание на то, что данное объявление интерфейса класса adding_machine не включает ни одной переменной, которая бы могла хранить результат выполнения операций сложения и вычитания. Методы add () и subtract () принимают в качестве параметра одно значение типа unsigned long. Объявление типа параметра сопровождается ключевым словом CORBA in, который говорит о том, что данный параметр является входным (mput). Это объявление класса хранится в отдельном исходном файле adding_machine.idl. Исходные файлы, содержащие ГОЬюпределения, должны иметь . idl-расширения. Прежде чем такой файл можно будет использовать, его необходимо преобразовать к С++чЈюрмату. Это преобразование можно выполнить с помощью препроцессора или отдельной программы. Все CORBA-реализации включают IDL-компиляторы. Существуют IDL-компиляторы лля языков С, Smalltalk, С++, Java и др. IDL-компилятор преобразует ГОЬюпределения в код соответствующего языка. В данном случае IDL-компилятор преобразует объявление интерфейса в легитимный C++-код. В зависимости от конкретной CORBA-реализации IDL-компилятор вызывается с использованием синтаксиса, который будет подобен слелующему:
Читать дальше