2011-10-20 16 views
0

私はCORBAを初めて使用しています。私は呼び出したいメソッドにパラメータを正しく渡すことに苦労しています。この方法は、IDL署名C++ CORBAメソッドの実装へのパラメータの受け渡し

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 }; 

IPlanningUpdateListenerIDLインタフェース自体であるとして定義される構造体です。私はクラスの_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の私の実装を受け入れるように得るかと私はomniidlが作成したOpStatus_out型にOpStatus構造体に変換するために何をすべきかが必要なのですかどのようにしていますか?

+1

'_objref_IPlanningUpdateListener *'は、あなたのORBに固有の内部型です。シグネチャを 'IPlanningUpdateListener_ptr'に変更すると、あなたのimplは移植性が向上します。 –

答えて

4

クライアントでは、OpStatusを_varに変更します。

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

実装は新しい構造体を作成して返します。

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

... 
} 
+0

説明:あらゆる種類の構造体 "出力"は、メモリをエンドクライアントに渡すふりをしていなければなりません。 _varはこれを可能にします。 ref-to-ptr(またはptr-to-ptr)を渡すのと同じように、メモリはフレームワークによって埋められます。 – sdg

+0

'OpStatus_var'への変更は答えの半分に過ぎませんでした。私は 'myClass-> addUpdateListener(opStatus、listener - > _ this());'の呼び出しを変更して、正しく動作させる必要がありました。 – Alastair

関連する問題