我是使用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上正确注册了我的所有服务,但是我不知道如何实际调用此方法。我有一个指向要添加为侦听器的服务的指针,但是它的类型不正确。有谁知道为什么omniidlIDL中现有的OpStatus和IPlanningUpdateListener类型转换为新的OpStatus_out_objref_IPlanningUpdateListener类型。我认为对于参数,我需要做的只是传递参考。

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


我的两个问题是如何获得此方法以接受IPlanningUpdateListener的实现作为参数,以及如何将OpStatus结构转换为omniidl已创建的OpStatus_out类型?

最佳答案

在客户端中,将OpStatus更改为_var。

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


该实现将创建一个新的结构以返回。

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

...
}

07-27 13:38