我是使用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
将IDL
中现有的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;
...
}