IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[COM] Liste de char


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut [COM] Liste de char
    Salut tlm,

    Est ce que quelqu'un pourrait m'indiquer comment faire pour passer une liste de char entre un serveur COM et son client?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    ca veut dire quoi ca une liste de char ?

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    un truc de ce genre
    list<char*, allocator<char*> >
    serait l'idéal.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Euh... On n'est pas supposé utiliser des BSTR en COM ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Dans ce cas, tu saurais pas comment faire pour faire passer une liste de BSTR ou du moins un tableau?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ben, ça dépend de ce que tu veux faire...
    Personnellement, je n'ai touché à COM qu'en InprocServer, donc où pour passer des données, il suffit de passer le pointeur...

    Si c'est ce que tu veux faire, ben, le mieux est d'allouer un tableau de BSTR (le type BSTR est un simple pointeur), le passer en paramètre à une fonction et le désallouer soi-même après usage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Voici la méthode que j'ai implémenté au niveau de mon serveur COM :

    STDMETHODIMP Test::GetServers(/*[in]*/ BSTR NodeName,/*[out]*/ BSTR** servertable) {

    //Some code
    BSTR* ptable = new BSTR[255];
    //.....
    *servertable = ptable;
    return S_OK;
    }
    Et voici comment je l'ai appelé au niveau de mon client:

    BSTR* servertable_ = new BSTR[255];
    _bstr_t nodename("localhost");
    pIFTest->GetServers(nodename,&servertable_);
    Mais ça ne marche pas : servertable_ ne contient qu'un seul élément alors qu'elle devrait en avoir 70.

    J'ai essayé de crée ma propre structure de liste dans le fichier idl :

    typedef struct tagELEMENT {
    BSTR lValue;
    [unique] struct tagELEMENT* pNext;
    } ELEMENT;
    Mais le client plante dès la déclaration d'un objet ELEMENT.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Tu es sûr que le problème n'est pas au REMPLISSAGE du tableau ou à la détection du nombre ?

    PS: Tu alloues le tableau dans le client ou dans le serveur, mais tu ne dois pas le faire dans les deux: L'un des deux tableaux est perdu...

    PPS: n'oublions pas que ce qui est alloué par un module doit généralement être désalloué par le même module. Il te faudra donc soit allouer et désallouer le tableau dans le client COM, soit exporter une fonction de désallocation dans le serveur COM.

    PPPS: Pour l'IDL, je ne peux pas t'aider, je ne connais pas. Moi, j'utilise de simples headers C/C++ avec la macro DECLARE_INTERFACE.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    J'alloue le tableau dans le client.
    Je vais vérifier le remplissage, je crois ne pas l'avoir fait.

    Merci.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Citation Envoyé par mambo
    Je vais vérifier le remplissage, je crois ne pas l'avoir fait.
    ALORS COMMENT SAIS-TU QUE TU AS UN SEUL ELEMENT AU LIEU DE 70 ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    En fait, j'ai une liste qui contient 70 élément (de type string) que je dois mettre dans le tableau servertable.

    Mais au niveau du client, je ne retrouve que le premier élément.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ben forcément, si t'as pas encore fait le remplissage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Mais si justement je l'ai rempli

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Dans ce cas montre-moi comment tu remplis et comment tu lis...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Voilà la méthode implémentée au niveau du serveur COM :

    typedef list<char*, allocator<char*> > charlist;
    STDMETHODIMP Test::GetServers(/*[in]*/ BSTR NodeName,/*[out]*/ BSTR** servertable) {

    charlist *ServerList = new charlist;
    HRESULT hrt = GetLocalServerList(1,strCATID, 1,ServerList);

    int i = 0;
    list<char*, allocator<char*> > ::iterator SLit;
    if (ServerList->size()> 0)
    {
    SLit = ServerList->begin();
    string servername;
    BSTR ptable[255];
    int i = 0;
    while (SLit!= ServerList->end())
    {
    servername = (*SLit);
    CComBSTR tempo(servername.begin());
    ptable[i] = tempo.Detach();
    i++;
    SLit++;
    LocalFree(tempo);
    }

    *servertable = ptable;
    }
    }
    return S_OK;
    }
    Je viens de revérifier cette méthode, le iq est là :

    *servertable = ptable;

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Donc,
    1. Tu n'alloues plus le tableau dans le serveur. C'est bien.
    2. Tu retournes l'adresse d'une variable locale. C'est mal.
    3. Je ne connais pas trop CComBSTR, mais je ne vois pas trop à quoi sert le LocalFree() dessus?


    Bref, pour le 2, tu dois recopier le tableau au lieu de passer son adresse. À supposer que *servertable fasse toujours 255 BSTRs, tu peux passer un simple BSTR* et utiliser une boucle FOR pour remplir le tableau...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Je viens de corriger la méthode au niveau du serveur, le remplissage se fait correctement. Voilà la dernière modification de la méthode au niveau du serveur COM :

    typedef list<char*, allocator<char*> > charlist;
    STDMETHODIMP Test::GetServers(/*[in]*/ BSTR NodeName,/*[out]*/ BSTR** servertable) {

    charlist *ServerList = new charlist;
    HRESULT hrt = GetLocalServerList(1,strCATID, 1,ServerList);

    int i = 0;
    list<char*, allocator<char*> > ::iterator SLit;
    if (ServerList->size()> 0)
    {
    SLit = ServerList->begin();
    string servername;
    BSTR ptable[255];
    int i = 0;
    while (SLit!= ServerList->end())
    {
    servername = (*SLit);
    CComBSTR tempo(servername.begin());
    ptable[i] = tempo.Detach();
    i++;
    SLit++;
    LocalFree(tempo);
    }

    for (int j=0; j < 255; j++) {
    servertable[j] = &ptable[j];
    //Some code....
    }
    }
    return S_OK;
    }
    Mais j'ai toujours pas le bon résultat au niveau du client :

    BSTR* servertable_ = new BSTR[255];
    BSTR** servertable = &servertable_;

    pIFTest->GetServers(nodename,servertable);

    for (int i=0; i < 255; i++) {
    char TABLE[255];
    BSTR test = *servertable[i];
    sprintf(TABLE, "%ws", test);

    //Some code...
    }
    Qu'est ce qui est faux ici ?

    Pour localfree, je sais pas vraiment qu'est ce que c'est. C'est juste un truc que j'ai essayé et que j'ai oublié là.

  18. #18
    Membre émérite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par défaut
    Salut,

    La bande passante est faible dans la passation des types de données entre un serveur COM et son client. C'est l'un défaut de COM.
    Mais du moins tu peux passer n'importe quel types de données en faisant un petit cast dans un VARIANT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     
    #pragma once
     
    namespace MCN
    {
    	template<typename T>
    	class CCastingVariant
    	{
    	public:
    		static T* CastFromVariant(VARIANT var)
    		{
    			if(var.vt != VT_BYREF || var.byref == NULL)
    				return NULL;
    			return (T*) var.byref;
    		}
     
    		static VARIANT CastToVariant(T* pT)
    		{
    			if(pT == NULL)
    				return CComVariant();
     
    			VARIANT var;
    			var.byref = (void*) pT;
    			var.vt = VT_BYREF;
    			return var;
    		}
    	};
    } // namespace MCN
    C'est une de mes classes utilitaire de Mcn.dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // Dans un code client
    MonType monObjet;
    MonserveurCOM.Function(MCN::CCastingVariant<MonType>::CastToVariant(&monObjet));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Dans le code serveur du composant COM
    HRESULT MonServeur::Function(VARIANT var)
    {
    MonType* pmonObjet = MCN::CCastingVariant<MonType>::CastFromVariant(var);
    //...

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Gabrielly : Je crois bien qu'on est en Inproc pour l'instant : Si tu parles de "Bande passante", c'est pour le marshalling, non?

    mambo : Le code du client ne suffit pas. Tu peux ajouter la version définitive du serveur ? (en éditant ton post par exemple)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Mon serveur est un serveur COM local exécutable.
    J'ai utilisé cet exemple http://www.codeproject.com/com/LocalCOMServerClient.asp pour le réaliser.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Créer une liste de char*?
    Par toutounesan dans le forum C++
    Réponses: 6
    Dernier message: 22/09/2007, 10h11
  2. Mise à jour de la liste des ports COM détectées
    Par chourmo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 23/12/2005, 15h11
  3. [C#] WinForm.Label : connaitre la taille d'une liste de char
    Par lord_paco dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/11/2004, 23h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo