CORBA в С++ Builder 6: не удаётся запустить ORB
От: Аноним  
Дата: 11.07.03 09:28
Оценка:
Здравствуйте. В кратце о задаче: необходимо, чтобы клиент обменивался с сервером строкой (а точнее XML документом в виде строки) посредством объектов CORBA. Клиент готов и работает, проблема в "сервере": при получении ссылки на корневой объектный адаптер RootPOA:

      CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"));


происходит НЕЧТО, мешающее дальнейшему запуску брокера — orb:

      orb->run();


т. е. программа просто виснет: выполняются все операторы до orb->run();, на котором всё стопорится. Если закомментировать получение ссылки, то запуск orb'а проходит успешно, другое дело, что он такой не нужен. В той документации на CORBA, которую нашёл в инете ничего полезного мне не оказалось. Вот весь код:

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include "sqrServer.h"
#include <corba.h>
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();

                 CORBA::ORB_var orb = CORBA::ORB_init(__argc, __argv);

                 CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
                 PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(obj);

                 CORBA::PolicyList policies;
                 policies.length(1);
                 policies[(CORBA::ULong)0] = rootPOA->create_lifespan_policy(
                                                PortableServer::PERSISTENT);

                 PortableServer::POAManager_var poa_manager = rootPOA->the_POAManager();


                 PortableServer::POA_var sqrPOA = rootPOA->create_POA("sqr_poa",
                                                           poa_manager,
                                                           policies);

                 PortableServer::ObjectId_var sqrId =
                         PortableServer::string_to_ObjectId("sqrObject");

                 sqrImpl sqrServant;

                 PortableServer::ObjectId_var sqrId =
                           PortableServer::string_to_ObjectId("sqrObject");

                 sqrPOA->activate_object_with_id(sqrId, &sqrServant);

                 poa_manager->activate();

                 //Здесь всё встаёт
                 orb->run();

                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        return 0;
}


Да, интерфейс вот такой простенький:

module Math {
interface sqr {string Receive(in string i);
};
};

Буду благодарен любой помощи.
Re: CORBA в С++ Builder 6: не удаётся запустить ORB
От: kavlad Россия http://www.wavesoft.ru
Дата: 14.07.03 05:39
Оценка:
Клиентский код без багов
Смтри код сервера.
Нет предела совершенству!
Re[2]: CORBA в С++ Builder 6: не удаётся запустить ORB
От: Аноним  
Дата: 14.07.03 11:06
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Клиентский код без багов

K>Смтри код сервера.

Собственно говоря, это и есть код сервера, т.к. он не работает. Т.е. если не запускать ОРБ в конце, то клиент сможет отправить запрос, сервер его выполнит, но отправить результат своих действий не сможет, т.к. не знает, куда. Вот ещё текст непосредственно самого выполняемого запроса:

//---------------------------------------------------------------------------
#include <vcl.h>

#pragma hdrstop

#include <corba.h>
#include "sqrServer.h"
#include "unit1.h"
extern TForm1 *Form1;

//---------------------------------------------------------------------------

#pragma package(smart_init)


sqrImpl::sqrImpl(const char *object_name):
        _sk_Math::_sk_sqr(object_name)
{
}

char* sqrImpl::Receive(const char* _i)
{
   Form1->XML->LoadFromFile(_i);
   Form1->Memo1->Lines->Add("Загрузка XML из файла:");
   Form1->Memo1->Lines->Add(_i);
   char *res = Form1->XML->AsString().c_str();
   Form1->XML->Clear();
   Form1->Caption = res;
   return res;
}


где Form1 — серверная форма, куда вывожу сообщения о поступивших запросах.
Re[3]: CORBA в С++ Builder 6: не удаётся запустить ORB
От: kavlad Россия http://www.wavesoft.ru
Дата: 14.07.03 12:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Попробуй явно указать ServantRetensionPolicy как RETAIN.
Хотя она по умолчанию принимает это значение.
Нет предела совершенству!
Re[4]: CORBA в С++ Builder 6: не удаётся запустить ORB
От: Аноним  
Дата: 15.07.03 05:33
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, <Аноним>, Вы писали:


K>Попробуй явно указать ServantRetensionPolicy как RETAIN.

K>Хотя она по умолчанию принимает это значение.

При создании sqrPOA я указал в его списке Policy, что необходимо использовать SRP как RETAIN, как вы и сказали, но это не помогло. Дело в том, что работа стопорится уже на полученни объектной ссылки на RootPOA, я просто комментировал все строчки после определения ОРБ'а до его запуска, так всё работало, но стоило мне добавить ещё

CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");


как всё вставало. Я делал эту программу, используя книжку А. Цимбала, смотрел его пример, да и вообще мой сервер практически целиком — его, наверное, у меня руки кривые, но это всё равно не объясняет, почему всё рушится при определении RootPOA. И вот что бесит меня больше всего: я уверен на сто %, что ошибка так же проста как детский мат, но чтобы её найти придётся мне ещё долго посидеть. Но, в обсчем, нам не привыкать Сейчас попробую сделать консольный сервер, чтобы совсем всё было как по книжке, посмотрим, что получится.
Re[5]: CORBA в С++ Builder 6: не удаётся запустить ORB
От: kavlad Россия http://www.wavesoft.ru
Дата: 15.07.03 09:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>как всё вставало. Я делал эту программу, используя книжку А. Цимбала, смотрел его пример, да и вообще мой сервер практически целиком — его, наверное, у меня руки кривые, но это всё равно не объясняет, почему всё рушится при определении RootPOA. И вот что бесит меня больше всего: я уверен на сто %, что ошибка так же проста как детский мат, но чтобы её найти придётся мне ещё долго посидеть. Но, в обсчем, нам не привыкать Сейчас попробую сделать консольный сервер, чтобы совсем всё было как по книжке, посмотрим, что получится.


Ну у Цимбала код отличается
Нет предела совершенству!
Re[6]: CORBA в С++ Builder 6: не удаётся запустить ORB
От: APTЁM  
Дата: 15.07.03 11:19
Оценка:
Здравствуйте, kavlad, спасибо вам большое за участие, дело всё таки было даже не в моих кривых руках, а в моей кривой голове, стыдно признаться:

просто после строки orb->run(); orb переходит в режим ожидания запросов, а т.к. у меня вся программа выполняется в одном потоке, то всё, что идёт дальше будет ждать до тех пор, пока не закроется orb, поэтому и не происходила активация формы, находящаяся дальше по тексту, что я рассчитывал за стопор всей программы.

После таких вот ошибок хочется обрить голову и уйти в монастырь (хотелось бы, конечно, в женский ). Но, это общеизвестно, чем больше практики — тем больше опыта, и, следовательно, больше шанс распознать ошибку от просто нормальноработающей программы . Ещё раз спасибо за участие, извиняюсь за ваше потраченное время, но уж больно безысходной стала ситуация на момент создания мною топика, уже не знал, остались ли вокруге столбы на которые я не лазил от отчаяния.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.