Hej Mogens,
Mange tak for hjælpen, jeg har fundet mit problem, det hele bundede ud i at
jeg ikke brugte CORBA::string_dup men char*.
Mvh. Jacob Just
"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:aqude5$1pne$1@news.cybercity.dk...
>
>
> "Jacob Just" <Jacob_Just@mail1.stofanet.dk> wrote in message
> news:<3dd249ca$0$5785$ba624c82@nntp04.dk.telia.net>...
>
> Jeg har ikke oversat noget af din kode, men den får lige et par
kommentarer
> med på vejen - både CORBA og C++ relaterede.
>
> [8<8<8<]
> > class NrReplyerImpl : virtual public POA_NrReplyer {
> >   char* name;
>
> Brug std::string i stedet for char* - det letter dig for mange
bekymringer.
>
> [8<8<8<]
> > NrReplyerImpl::NrReplyerImpl(){
> >   name = "c-server";
> >   nr = 4;
> > }
>
> Foretræk initialisering fremfor assignment i C++:
>
>   NrReplyerImpl::NrReplyerImpl() :
>    name("c-server"),
>    nr(4)
>   {
>   }
>
>
> >
> > NrReplyerImpl:

NrReplyerImpl(){
> >   delete name;
>
> Har du allokeret den memory som name peger på med "new" ?
> (Hint: nej - så skal du ikke delete name)
>
>
> [8<8<8<]
> > char* NrReplyerImpl::getName(){
> >   cout << "received request" << endl;
> >   //return name;
> >   //return CORBA::string_dup("Hello world\n");
> >   return name;
>
> Det er påkrævet at bruge CORBA::string_dup her.
>
> > Når jeg skal smide denne om på nameserveren gør jeg som følger, hvor
> > nc er
> > nameserver:::
> >
> >     cout << "Running...\n" << endl;
> >     CosNaming::Name temp(2);
> >     temp.length(1);
> >     temp[0].id = CORBA::string_dup("Repliers");
> >     temp[0].kind = CORBA::string_dup("cxt");
> >     try{
> >       nc->bind_new_context(temp);
>
> Her laver du en resource-leak.
> Skriv hellere:
>         CosNaming::NamingContext_var rnc =
>            nc->bind_new_context(temp);
>
> Forslag:
> Ryk eventuelt "temp" og tildelingen af "temp" ind i "try" delen - så får
du
> begrænset scope.
>
> >     }
> >     catch ( CosNaming::NamingContext::AlreadyBound& ){;}
> >     PortableServer::ObjectId_var oid;
> >     PortableServer::ServantBase_var theServant;
> >     CORBA::Object_var objV;
>
> Foretræk at initialisere variable efterhånden som de erklæres, hvis det er
> muligt.
> Foretræk at erklære dem efterhånden som man får brug for det.
>
> >
> >     theServant = new NrReplyerImpl();
> >     oid = poa->activate_object(theServant.in());
> >     objV = poa->id_to_reference(oid);
> >
> >     CosNaming::Name name(2);
> >     name.length (2);
> >     name[0].id = CORBA::string_dup ("Repliers");
> >     name[0].kind = CORBA::string_dup ("cxt");
> >     name[1].id = CORBA::string_dup ("c-server");
> >     name[1].kind = CORBA::string_dup ("service");
> >     nc->rebind(name,objV);
>
> Umiddelbart ser det rimeligt ud - bortset fra lidt leaks og en destructor,
> der ikke virker.
> Jeg har lige prøvet den tilsvarende måde at aktivere og registere objektet
> (med en anden IDL), og det virker problem-frit.
> Der mangler naturligvis nogle trin, som du sikkert har skåret væk:
>
>   1. Initialiser ORB'en
>   2. Få fat på en POA - formodentlig RootPOA
>   3. Aktiver POAManageren
>   4. Det du har skrevet i indlæget
>   5. Få ORB'en til at processere indkommende kald - f.eks. med
"orb->run();"
>
> Prøv eventuelt noget i retningen af (ikke test kode):
>   // Create a CORBA object
>   // First create servant
>   NrReplyerImp      replyer_servant;
>   // Then register servant with POA
>   CORBA::Object_var replyer_obj =
> poa->servant_to_reference(&replyer_servant);
>
>   // Register replyer CORBA object with naming-service
>   name[0].id = CORBA::string_dup ("Repliers");
>   name[0].kind = CORBA::string_dup ("cxt");
>   name[1].id = CORBA::string_dup ("c-server");
>   name[1].kind = CORBA::string_dup ("service");
>   nc->rebind(name,replyer_obj);
>
> [8<8<8<]
> >
> > org.omg.CORBA.BAD_PARAM:   vmcid: 0x0  minor code: 0  completed: No
> >
>
> Jeg kan ikke umiddelbart se årsagen til ovenstående exception.
> Er du _sikker_ på at C++ serveren og Java clienten arbejder ud fra samme
> IDL-fil ?
> Er der forskel på om du kører server og klient på samme maskine eller ej ?
> (Det kunne være et netværks konfigurations problem)
> Har din ORB en utility til at liste hvad der er registeret i NameService ?
> Er der et eksempel (klient og server) med din ORBer, som bruger
NameService
> og som du _ved_ virker. Så kan du skrive det tilsvarende eksempel i det
> andet sprog, og så _ved_ du at problemet må ligge i det du lige har
skrevet.
>
>
> To råd der har hjulpet mig meget i relation til C++ og CORBA:
>
> 1)
> Hvis du vil lave noget seriøst med CORBA og C++, så få (som jeg tidligere
> har nævnt) fat på bogen
>    Advanced CORBA Programming with C++
>    Michi Henning, Steve Vinoski
>    ISBN 0-201-37927-9
> og læs den.
> Den siges iøvrigt også at være god for Java programmører, der skal skrive
> CORBA.
> I virkeligheden er der ikke særlig stor forskel på hvad der skal laves i
C++
> og Java.
>
> 2)
> Memory-håndtering i C++ er i sig selv ikke nødvendigvis simpelt, og CORBA
> gør det bestemt ikke nemmere.
>
> Jeg har haft meget gavn af at anvende Borland C++Builder
> Professional/Enterprise V5/V6 (
www.borland.com) sammen C++ CORBA
> implementeringen TAO (
http://www.cs.wustl.edu/~schmidt/TAO.html).
>
> C++Builder Professional/Enterprise har en feature, der hedder CodeGuard.
> CodeGuard checker effektivt en lang række typiske C og C++ fejl, såsom
> memory-leak, tilgang til frigivet memory, double delete, buffer over-run
> etc.
> CodeGuard finder også af og til fejl i ORB'en, selvom den er checket med
> Purify.
> For god ordens skyld: det er muligt at skrive en CORBA server eller klient
> med C++ uden at der er nogen former for fejl-rapporter fra CodeGuard. Man
> gør sig selv en stor tjeneste ved hele tiden at være i den tilstand.
>
> TAO er en open-source ORB, som umiddelbart kan oversættes med C++Builder.
> Hvis man oversætter såvel ORB'en som en egen applikation med CodeGuard
> enabled, giver det er vældigt godt check af den samlede applikation.
>
> Selv hvis man ikke ønsker at bruge TAO eller C++Builder til produktion, er
> kombinationen også _rigtig_ god til debug og uddannelsesformål.
>
>
> Venlig hilsen
>
> Mogens Hansen
>
>