Corba, call by value

Jack

Mitglied
Hallo,

1. Frage:
Verwendet Corba call by value oder call by reference bei Aufrufen von IDL Interfaces.

2. Frage:
Kann man in der IDL beschreiben ob die parameter eines interfaces call by value oder call by reference sind. Hauptsächlich interessiert mich das Szenario: Java Client und C++ Server.


Vielen Dank!
 
2. Frage:
Kann man in der IDL beschreiben ob die parameter eines interfaces call by value oder call by reference sind.

Zu Corba kann ich nicht viel sagen. Aber ich hab mal was mit IDL gemacht als wir
eine Erweiterung für Firefox (XPCOM) geschrieben haben.

Bei idl kannst du die Art des Parameteraufrufsmechanismus angeben:

Code:
interface MyInterface{
    void foo1(in int a);
    void foo2(inout int a);
    void foo3(out int a);
}

Was dann dein idl Compiler für C++ Code ausspuckt kannst du dann ja selber testen...
Ich hoffe das beantwortet deine Frage ein Stück weit...

Gruß

RedWing
 
Danke für deine Antwort!

Das in und out hab ich auch schon gesehen. Mich macht hierbei jedoch folgender Punkt sorgen. Wenn ich ein Parameter als "in" deklariere habe ich noch nicht die Gewissheit, dass es keine Referenz auf die Speicherstelle ist?

Ich werde aber das Prinzip von in und out auf jeden Fall nochmals nachlesen!
 
Hallo,

Das in und out hab ich auch schon gesehen. Mich macht hierbei jedoch folgender Punkt sorgen. Wenn ich ein Parameter als "in" deklariere habe ich noch nicht die Gewissheit, dass es keine Referenz auf die Speicherstelle ist?

Im Prinzip hast du Recht. Entweder du bekommst es als const type* übergeben
oder per value.
Aber wieso übersetzt dus nicht einfach mal mittels deines idl Compilers...
Dann siehst du was er für C++ Code generiert und du hast Gewissheit.

Gruß

RedWing
 
P.S. Habs grad mal mit dem idl Compiler von XPCOM ausprobiert:

test.idl:

Code:
#include "nsISupports.idl"

[scriptable, uuid(ac7f236b-8fd6-4f15-9d78-02ec7431092c)]
interface MyInterface{
    void foo(in PRUint32 t);
};

Generiertes Header test.h:

Code:
/*
 * DO NOT EDIT.  THIS FILE IS GENERATED FROM test.idl
 */

#ifndef __gen_test_h__
#define __gen_test_h__


#ifndef __gen_nsISupports_h__
#include "nsISupports.h"
#endif

/* For IDL files that don't want to include root IDL files. */
#ifndef NS_NO_VTABLE
#define NS_NO_VTABLE
#endif

/* starting interface:    MyInterface */
#define MYINTERFACE_IID_STR "ac7f236b-8fd6-4f15-9d78-02ec7431092c"

#define MYINTERFACE_IID \
  {0xac7f236b, 0x8fd6, 0x4f15, \
    { 0x9d, 0x78, 0x02, 0xec, 0x74, 0x31, 0x09, 0x2c }}

class NS_NO_VTABLE MyInterface {
 public:

  NS_DEFINE_STATIC_IID_ACCESSOR(MYINTERFACE_IID)

  /* void foo (in PRUint32 t); */
  NS_IMETHOD Foo(PRUint32 t) = 0;

};

Also wie du siehst der XPCOM IDL Compiler macht aus einem in ein call per value
zumindest für primitive Datentypen und ich denke mal das er für komplexe Datentypen
ein const Typename* generiert...
Wie gesagt wie es bei deinem Corba IDL Compiler ausschaut musst du selber mal testen.

Gruß

RedWing
 
Zuletzt bearbeitet:
Zurück