将参数传递给 C++ CORBA方法实现

发布于 2024-12-11 10:21:36 字数 1264 浏览 0 评论 0原文

我是使用 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类型。我认为对于 out 参数,我所需要做的就是传递一个引用。

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

我的两个问题是如何让此方法接受 IPlanningUpdateListener 的实现作为参数,以及我需要做什么才能将 OpStatus 结构转换为 omniidl 创建的 OpStatus_out 类型?

I'm new to using CORBA and I'm struggling with correctly passing the parameters to a method that I want to invoke. The method has the IDL signature

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

OpStatus is a struct defined as

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

and IPlanningUpdateListener is itself an IDL interface.

I've implemented the _impl of the class looks like

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

I've managed to register all my services with the ORB correctly and but I don't know how to actually call this method. I've got a pointer to the service that I want to be added as a listener but it's not of the correct type. Does anyone know why omniidl converts the existing OpStatus and IPlanningUpdateListener types in the IDL into the new OpStatus_out and _objref_IPlanningUpdateListener types. I thought for out parameters all I needed to do was pass a reference.

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

My two questions are how do I get this method to accept my implementation of the IPlanningUpdateListener as a parameter and what do I need to do to convert the OpStatus struct into the OpStatus_out type that the omniidl has created?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绅刃 2024-12-18 10:21:36

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

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

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

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

...
}

In the client change OpStatus to a _var.

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

The implementation will create a new struct to return.

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

...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文