Передача параметров в реализацию метода C ++ CORBA - PullRequest
0 голосов
/ 20 октября 2011

Я новичок в использовании CORBA и пытаюсь правильно передать параметры методу, который я хочу вызвать. Метод имеет IDL подпись

void addUpdateListener(out OpStatus opStatus, in IPlanningUpdateListener listener);

OpStatus - это структура, определенная как

struct OpStatus {
    EComponent EComp;
    EStatus State;
    string Message;
}
enum EComponent { CompA, CompB, CompC };
enum EStatus { SUCCESS, FAILURE, RETRY };

и IPlanningUpdateListener сам по себе IDL интерфейс.

Я реализовал _impl класса, похожего на

void addUpdateListener(OpStatus_out opStatus, _objref_IPlanningUpdateListener* listener)    {
    std::cout << "addUpdateListener called\n";
}

Мне удалось правильно зарегистрировать все мои службы в ORB, но я не знаю, как на самом деле вызвать этот метод. У меня есть указатель на сервис, который я хочу добавить в качестве прослушивателя, но он неверного типа. Кто-нибудь знает, почему omniidl преобразует существующие типы OpStatus и IPlanningUpdateListener в IDL в новые типы OpStatus_out и _objref_IPlanningUpdateListener. Я подумал, что для параметров мне нужно только передать ссылку.

IPlanningUpdateListener_impl* listener // initialised and registered earlier
OpStatus opStatus; 
myClass->addUpdateListener(opStatus, listener);

Мои два вопроса: как мне заставить этот метод принять мою реализацию IPlanningUpdateListener в качестве параметра и что мне нужно сделать, чтобы преобразовать структуру OpStatus в тип OpStatus_out, созданный omniidl?

1 Ответ

4 голосов
/ 20 октября 2011

В клиенте измените OpStatus на _var.

OpStatus_var opStatus; 
myClass->addUpdateListener(opStatus, listener);

Реализация создаст новую структуру для возврата.

void addUpdateListener(OpStatus_out opStatus, _objref_IPlanningUpdateListener* listener)    
{
  opStats = new OpStatus;

...
}
...