Обычно, совокупность cpp- и hh-файлов на стороне клиента называют стабом. Конечно, в зависимости от содержимого IDL-файла кодогенератор генерирует различный код. При наличии в IDL-файле одного или нескольких интерфейсов, а именно для этого существует язык IDL – в файлах на стороне клиента появляются классы (по одному на каждый интерфейс), экземпляры которых, создаваемые ORB на стороне клиента, называются proxy-объектами. Proxy-объекты создает ORB. Proxy-объекты – это те объекты, к которым на самом деле обращается клиентское приложение, имея в виду, что оно обращается к удаленному объекту. Здесь же для каждого интерфейса создаются классы, которые можно рассматривать как управляющие структуры по отношению к proxy-объектам. Экземпляры таких классов часто называют объектными ссылками.
Несмотря на массу новых терминов, принцип удаленного вызова в CORBA такой же, как, например, в RMI. Следующая картинка наглядно демонстрирует этот факт
Для строк, интерфейсов, структур, объединений, массивов и последовательностей генерируется несколько классов и несколько синонимов типов. Эти классы отличаются друг от друга для различных конструкций 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 для доставки к серверному объекту. Результат выполнения удаленного метода извлекается из аналогичного буфера и возвращается клиенту.