Обычно, совокупность cpp- и hh-файлов на стороне клиента называют стабом. Конечно, в зависимости от содержимого IDL-файла кодогенератор генерирует различный код. При наличии в IDL-файле одного или нескольких интерфейсов, а именно для этого существует язык IDL – в файлах на стороне клиента появляются классы (по одному на каждый интерфейс), экземпляры которых, создаваемые ORB на стороне клиента, называются proxy-объектами. Proxy-объекты создает ORB. Proxy-объекты – это те объекты, к которым на самом деле обращается клиентское приложение, имея в виду, что оно обращается к удаленному объекту. Здесь же для каждого интерфейса создаются классы, которые можно рассматривать как управляющие структуры по отношению к proxy-объектам. Экземпляры таких классов часто называют объектными ссылками.

Несмотря на массу новых терминов, принцип удаленного вызова в CORBA такой же, как, например, в RMI. Следующая картинка наглядно демонстрирует этот факт

Удаленный выход в рамках CORBA

Для строк, интерфейсов, структур, объединений, массивов и последовательностей генерируется несколько классов и несколько синонимов типов. Эти классы отличаются друг от друга для различных конструкций IDL, но имеют и много общего. Их задача – обеспечить доступ из программы клиента к proxy-объекту, помочь клиенту с выбором типов аргументов удаленных методов в зависимости от их атрибутов (in, out, или inout), обеспечить отсутствие утечек памяти.

Главной задачей классов, функций, типов и т.д., сгенерированных компилятором на стороне клиента, является вызов удаленных методов. Основным классом, сгенерированным на стороне клиента для IDL-интерфейса MyInterface, является proxy-объект MyIterface. Он содержит все необходимое для преобразования локального вызова клиентом его метода в вызов удаленного метода на стороне сервера:

 

// IDL

interface MyInterface

{

 void MyMethod(in long arg);

};

// C++

class MyInterface : public virtual CORBA_Object

{

public:

...

virtual long MyMethod(long _arg);

...

};

 

Рассмотрим псевдокод метода ::MyMethod(long _arg): 


long MyInterface::MyMethod(long _arg)

{

long ret;

InBuffer inBuf;

OutBuffer outBuf;

 

inBuf << “MyMethod” << 1 << _arg;

outBuf = _invoke(_obuf);

outBuf >> ret;

rreturn ret;

}

 

Смысл приведенного кода достаточно очевиден: при выполнении клиентом удаленного вызова происходит вызов этого метода для proxy-объекта, который создает буфер для помещения в него информации об имени метода, числе и конкретных значениях его аргументов, а затем содержимое этого буфера передается ORB для доставки к серверному объекту. Результат выполнения удаленного метода извлекается из аналогичного буфера и возвращается клиенту.