我是使用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类型? / p>
答案 0 :(得分:4)
在客户端将OpStatus更改为_var。
OpStatus_var opStatus;
myClass->addUpdateListener(opStatus, listener);
实现将创建一个新的结构来返回。
void addUpdateListener(OpStatus_out opStatus, _objref_IPlanningUpdateListener* listener)
{
opStats = new OpStatus;
...
}