2011-10-20 2 views
0

저는 CORBA를 처음 사용하기 때문에 호출하려는 메서드에 매개 변수를 올바르게 전달하는 데 어려움을 겪고 있습니다. 상기 방법은 서명 IDLC++ 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 }; 

IPlanningUpdateListener 정의 구조체 것은 자체 IDL 인터페이스이다. 내가 제대로 ORB와 내 모든 서비스를 등록 관리했습니다하고 있지만 실제로이 방법을 호출하는 방법을 모르는

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

처럼 클래스의 _impl 구현했습니다

보인다. 리스너로 추가하려는 서비스에 대한 포인터가 있지만 올바른 유형이 아닙니다. 누구도 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