+ Répondre à la discussion
Affichage des résultats 1 à 18 sur 18
  1. #1
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut Error Resolve (NameService) .

    Hello

    I am writing a program to communicate with an existing one using CORBA.

    After i Create a name object, containing the name test/context:
    CosNaming::Name name;
    name.length(1);
    name[0].id = m_ServerName.c_str();
    name[0].kind = m_ServerKind.c_str();

    then I try to resolve the name service using:
    return rootContext->resolve(name);

    it doesn't catch errors.

    But when i narrow the object reference:
    serverPtr = SOT_Server_Command::_narrow(corba_obj);

    CORBA::is_nil(serverPtr) error is catched !!!!

    i can't understand why the resolve name didnt give errors but when i narrow the object reference i get nill result.

    Thank you for the help.

    P.S: Source files given in Private message.

  2. #2
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Hi,

    The object reference you get from NameService is certainly not of SOT_Server_Command type. That's why narrow operation returns nil.

    You could check the type of the object you get with following code:
    CORBA::String_var s = corba_obj->repository_id();
    std::cout << "corba_obj type is: " << s.in() << std::end;
    P.S.: This is a French forum. If you have some knowledge of French, please use it.

  3. #3
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    Merci pour votre réponse et désolé pour l'anglais.

    J'ai ajouté votre code pour voir le type de l'objet, j'ai eu cette erreur:

    ‘class CORBA::Object’ has no member named ‘repository_id’
    Note: j'utilise le C++

    Merci pour votre aide.

  4. #4
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Désolé, j'ai fait une petite erreur. Voici le bon code (noter le '_' devant repository_id):
    Code :
    1
    2
    3
    CORBA::String_var s = corba_obj->_repository_id();
    std::cout << "corba_obj type is: " << s.in() << std::end;

  5. #5
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    J'ai encore la même erreur!!!

    Code :
    1
    2
    3
    4
    FoxCommander.cpp: In function ‘int main(int, char**)’:
    FoxCommander.cpp:307: error: ‘class CORBA::Object’ has no member named ‘_repository_id’
    FoxCommander.cpp:308: error: ‘end’ is not a member of ‘std’
    make: *** [FoxCommander.o] Erreur 1

  6. #6
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Alors c'est que malheureusement votre ORB n'est pas à jour avec le standard "C++ language mapping"
    Quel ORB utilisez-vous ?

    De toutes façons, si corba_obj n'est pas null, et que SOT_Server_Command::_narrow(corba_obj) retourne null, c'est que corba_obj n'est pas du type SOT_Server_Command.
    Vérifiez quel est le type de l'objet stocké dans le NameService.

  7. #7
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    J'utilise le omniORB-4.1.4.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CORBA::Object_ptr corba_obj = corbaConnectionHandler->getObjectReference();
    
    //in another file the  corbaConnectionHandler is defined to return "CORBA::Object_ptr" such as:
      
    CosNaming::Name name;
      name.length(1);
      name[0].id   = "sot";
      name[0].kind = "context";
    
      return rootContext->resolve(name);
    // ------------------------------------
    
    sot_serverPtr = SOT_Server_Command::_narrow(corba_obj);
    
          if(CORBA::is_nil( sot_serverPtr ) )
    	{
    	  sotERROR <<"Server ptr is null: connection is not obtained. " <<std::endl;
    	  return NULL;
    	}
    C'est cette erreur qui est donnée par le programme .

    Comment Vérifiez quel est le type de l'objet stocké dans le NameService?

    Merci beaucoup pour votre aide.

  8. #8
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Une question d'abord:
    Je ne vois pas de test pour vérifier que corba_obj n'est pas nil !
    Etes-vous sûr qu'il ne l'est pas ?

    Si oui, Vous pouvez essayer 2 choses:

    1: le CORBA::Object d'OmniORB à un attribut non-standard _PD_repoId
    Si OmniORB fonctionne comme je le suppose, cet attribut contient le RepositoryID (i.e. le nom du type) de l'objet.
    Donc:
    Code :
    1
    2
    std::cout << "corba_obj RepositoryID = " << corba_obj->_PD_repoId << std::endl;
    2: OmniORB a un outil nommé catior qui permet de décoder un IOR et donc d'afficher son type.
    Il faut d'abord afficher l'IOR de l'objet:
    Code :
    1
    2
    3
    4
    // Requires ORB variable
    CORBA::String_var s = orb->object_to_string(corba_obj);
    std::cout << "corba_obj IOR:\n" << s.in() << std::endl;
    Puis appeler la commande catior avec l'IOR affiché:

  9. #9
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    Oui je fait un test " if(CORBA::is_nil( corba_obj ) ) " mais il n'y a pas de problemes.

    Pour le type de corba_obj:

    j'ai trouvé:
    corba_obj RepositoryID = IDL:omg.org/CORBA/Object:1.0

    Pourquoi il n'est pas de type sot_server_command??!!
    D'habitude le "resolve(name)" retourne un objet de quel type ??!!

  10. #10
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    C'est sans doute que OmniORB ne stocke malheureusement pas le type réel de l'objet dans son attribut _PR_repoId.
    Ma première option n'est donc pas la bonne.

    Essayez la 2e avec catior.

    Pourquoi il n'est pas de type sot_server_command??!!
    Il est peut-être aussi de ce type là! CORBA::Object est le type de base dont héritent tout les objets CORBA.

    D'habitude le "resolve(name)" retourne un objet de quel type ??!!
    Ca retourne toujours un CORBA::Object. C'est bien pour ça qu'il faut faire un narrow pour le "caster" dans le type dont on pense qu'il est réellement.

  11. #11
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    J'ai eu ce résultat avec catior:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Type ID: "IDL:hppCorbaServer/SOT_Server_Command:1.0"
    Profiles:
    1. IIOP 1.2 172.27.11.79 39153 "...>M..Q......"
                TAG_ORB_TYPE omniORB
                TAG_CODE_SETS char native code set: ISO-8859-1
                              char conversion code set: UTF-8
                              wchar native code set: UTF-16
                              wchar conversion code set: UTF-16
    Désolé , mais je ne comprends pas tous ce qu'elle donne!!!
    Il est bien de type SOT_Server_Command ...

    C'est ou le problème dans mon code alors ?!!

  12. #12
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Cela donne que le RepositoryID de l'objet est IDL:hppCorbaServer/SOT_Server_Command

    Avec "hppCorbaServer" qui est soit un module, soit un pragma prefix.
    Quel est le contenu de l'IDL ?
    l'IDL du client et du serveur sont-ils tout les deux compilés avec OmniORB ?
    Avec quelles options ?

    Que donne le code suivant ?
    if (corba_obj->_is_a("IDL:hppCorbaServer/SOT_Server_Command:1.0"))
    std::cout << "corba_obj is a IDL:hppCorbaServer/SOT_Server_Command:1.0" << std::endl;
    else
    std::cout << "corba_obj is NOT a IDL:hppCorbaServer/SOT_Server_Command:1.0" << std::endl;
    Dans le code généré par OmniORB pour SOT_Server_Command, y a-t-il une chaîne de caractères qui ressemble à un RepositoryID (IDL:...SOT_Server_Command:1.0) ?
    Quelle est-elle ?

  13. #13
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    J'ai trouvé et fixé la première erreur . En fait, c'etait pas le bon fichier idl que je compile avec le programme.
    J'utilise : omniidl -bcxx filename.idl

    dans le fichier IDL, il y a:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      interface SOT_Server_Command
      {
        void run( in string cmd );
        void runAndRead( in string cmd, out StringStreamer os );
        void readVector( in string signalName, out DoubleSeq value );
    
        long createOutputVectorSignal( in string signalNameCorba );
        long createInputVectorSignal( in string signalNameCorba );
        void readInputVectorSignal( in long signalRank, out DoubleSeq value );
        void writeOutputVectorSignal( in long signalRank, in DoubleSeq value );
    
        // RegisterCallback
        void registerClient(in NotifyCallback client, in string clientName );
        void unregisterClient(in string clientName);
      };
    Le probleme est que maintenant le programme donne une erreur directement apres le :
    " return resolve (name) " qui est bien de type "Type ID: "IDL:hppCorbaServer/SOT_Server_Command:1.0".

    Il donne une erreur même avant le "_narrow(corba_obj)"

    Note: Le corba_obj n'est pas nill ...

  14. #14
    Invité de passage
    Profil pro Amine ABM
    Inscrit en
    novembre 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Nom : Amine ABM

    Informations forums :
    Inscription : novembre 2010
    Messages : 17
    Points : 3
    Points
    3

    Par défaut

    Bonjour

    Merci beaucoup pour votre aide.
    Le problème est résolu .. c'était pas le bon fichier idl que j'utilise.

    J'ai une dernière question SVP:
    Je peux changer dans le fichier idl du client (ajouter une définition de quelque chose sans modifier la hiérarchie)?

    C'est possible que le fichier .idl du serveur soit différent de celui du client ?

  15. #15
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Bonjour,

    C'est possible que le fichier .idl du serveur soit différent de celui du client ?
    C'est possible, mais dangereux !
    Si les définitions des types et interfaces utilisées par le client ET le serveur ne sont pas exactement les mêmes, le comportement est indéterminé et on peut avoir des erreurs vraiment bizarres (selon les ORBs utilisés)...

    Mon conseil est de toujours utiliser le même IDL côté client et serveur.
    Et si on change l'IDL, ne pas oublier de re-générer le code pour les 2 côtés !!

  16. #16
    Nouveau Membre du Club
    Inscrit en
    juillet 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : juillet 2006
    Messages : 194
    Points : 38
    Points
    38

    Par défaut

    Bonjour à tous,

    Tout d'abord excusez mon ignorance de corba et mon manque de culture dans les environnements/outils de développement.

    Ma question est : y a -t-il un moyen de comprendre corba sans utiliser java ou C++?


    Mes prérequis sont TCP/IP, SGBD, scripting(light), vba etc...

    Merci infiniment de votre compréhension et de vos excuses de cette interférence de l'ignorance dans cet océan de technologies!

  17. #17
    Membre éclairé
    Homme Profil pro Julien Enoch
    Architecte technique
    Inscrit en
    septembre 2006
    Messages
    219
    Détails du profil
    Informations personnelles :
    Nom : Homme Julien Enoch
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2006
    Messages : 219
    Points : 301
    Points
    301

    Par défaut

    Bonjour,

    Ma question est : y a -t-il un moyen de comprendre corba sans utiliser java ou C++?
    Comprendre les principes de base de CORBA: oui
    La spécification CORBA elle même n'est liée à aucun langage (à part l'IDL).

    Après pour utiliser CORBA, il faut forcément un langage de programmation (C ou C++ ou Java ou Ada ...)

    Mes prérequis sont TCP/IP, SGBD, scripting(light), vba etc...
    Aucun besoin de ces connaissances pour CORBA.
    A part peut-être Visual Basic, car il existe un ORB pour ce langage: VBOrb
    Mais il a l'air assez vieux (2003) et je ne sais pas ce qu'il vaut...

  18. #18
    Nouveau Membre du Club
    Inscrit en
    juillet 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : juillet 2006
    Messages : 194
    Points : 38
    Points
    38

    Par défaut

    Merci infiniment,

    Une réponse de ce genre donne envie de rester sur ce forum qui, à mon propre avis est le meilleur.


    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •