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 :

Client COM


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut Client COM
    J'ai un serveur COM(qui lui même est un client COM) avec un .idl donné et j'essaye de developper un client, j'arrive bien à créer une instance de mon serveur (Hello.exe se lance)mais lors de l'appel d'une méthode de mon serveur, j'ai une erreur du genre 'First-Exception 0x000006B5: No Name.'Sachant que je voie apparaître la liste des méthodes exposées par le .idl.
    Ci-dessous se trouvent le .idl de mon serveur et les qlq ligne de code du coté client:
    Auriez-vous une petite idée ?
    Code SRV:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    [
      uuid(xxx),
      version(1.0),
      helpstring("Hello 1.0 Type Library")
    ]
    library Hello_Library
    {
        importlib("stdole32.tlb");
        importlib("stdole2.tlb");
     
       //! This is the public COM interface exposed by the Hello
       [
    	object,
    	uuid(yyy),
    	dual,
    	helpstring("IHello Interface"),
    	pointer_default(unique)
      ]
      interface IHello : IDispatch
      {
                    [id(1), helpstring("method ConnectMCU")] 
                    HRESULT SayHello();
                    ......
       };	
     
      //! This interface is used for testing (for example by the testing tool)
      [
                  object,
                  uuid(zzz),
                  dual,
                  helpstring("IHelloTest Interface - this interface is used for tests"),
                  pointer_default(unique)
      ]
      interface IHelloTest : IDispatch
      {
      };
     
    	//! Declares the COM object and its interfaces
    	[
    		uuid(xxx),
    		helpstring("Hello Class")
    	]
    	coclass Ello
    	{
    		[default] interface IHello;
    		interface IHelloTest;
    	};
     
    	//! This fake object is used by scripting languages to access the IHelloTest interface
    	[
    		uuid(www),
    		helpstring("HelloTest Class - This class is used by VB to access the IHelloTest interface"),
    		hidden,
    		noncreatable
    	]
    	coclass HelloTest
    	{
    		[default] interface IHelloTest;
    	};
     
    	//! This fake object is used to declare the IOther and IOther2
    	//! interfaces,
    	[
    		uuid(vvv),
    		hidden,
    		noncreatable
    	]
    	coclass HelloRegisterAllInterfaces
    	{
    		interface IOther;
    		interface _IOtherEvents;
    		interface IOther2;
    	};
    };
    	{
    Code CLIENT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CComPtr<IHello> m_pHello;
    HRESULT hr =::CoCreateInstance(CLSID_Ello, NULL, CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER,IID_IHello,(void**)&m_pHello);
     
     
    HRESULT h0 = m_pHello->SayHello(); //ERROR !!

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Salut, as-tu pensé à faire un CoInitialize dans ton client ?

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Et tu as testé le résultat de CoCreateInstance?
    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.

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Que vaut hr renvoyé par CoCreateInstance ?
    Tu as bien enregistré ton serveur (regsvr32) ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut suite des rq sur mon code
    Tout d'abord merci pour vos réponses.

    Pour répondre à toutes vos questions :
    - J'ai fait un CoInitialize(NULL) qui renvoie 0.
    - hr = CoCreateInstance renvoie 0.
    D'ailleurs je voie apparaître les methodes en faisant -> sur VisualC++.
    - Mon serveur est un executable : Hello.exe.
    Je peux l'enregistrer en écrivant regsvr32 Hello.exe ? (j'ai une rq disant que ce n'est pas une dll ou un .OCX)

    Lorsque j'arrive à CoCreateInstance, le Hello.exe apparaît bien dans le 'Task Manager'

    Vous en avez une idée ?

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut Re: suite des rq sur mon code
    Citation Envoyé par doundoun
    D'ailleurs je voie apparaître les methodes en faisant -> sur VisualC++.
    Il ne faut pas te fier à ça, il se base sur l'idl.
    Au fait, pourquoi le flag CLSCTX_REMOTE_SERVER ?

    - Mon serveur est un executable : Hello.exe.
    Je peux l'enregistrer en écrivant regsvr32 Hello.exe ? (j'ai une rq disant que ce n'est pas une dll ou un .OCX)
    c.a.d ?

    Quel est le code de SayHello ?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Tu peux afficher l'adresse de SayHello ?
    Si ça se trouve, la vtable de l'interface n'a pas été correctement remplie...
    (ou pire, peut-être que la vtable elle-même manque...)

    (Enfin je dis ça, mais je débute en COM, et je n'ai pas encore étudié les "type library": Je ne connais encore que la déclaration traditionnelle en C/C++ avec 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.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut
    CLSCTX_REMOTE_SERVER est inutile. (au départ je voulais faire le client à distance). Mais pour l'instant j'essaye juste d'avoir ce qu'il faut en local.
    La méthode SayHello ne fait pas grand chose a part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    STDMETHODIMP CHello::SayHello()
    {
    AfxMessageBox("hello"); 
    return 1;
    }
    ou se trouve vtable ?
    ps: je suis encore plus débutant (en COM)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut
    J'obtiens bien le boite de dialogue "hello".

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    En fait, je ne pense pas que la vtable d'une interface soit accessible en C++ (en C, elle l'est).

    Je t'ai cru plus avancé que moi en COM parce que tu utilises une "type library", alors que je n'ai même pas compris ce concept. (Je n'ai pas non plus vu les IDispatch : Mes interfaces héritent simplement de IUnknown)

    Tu devrais peut-être essayer en C et C++ en déclarant ton interface à l'ancienne...


    PS: Tu devrais aussi essayer en affichant "hello" SANS utiliser les fonctions de MFC (Afx...) : Teste avec un MessageBox(NULL, "hello world!", "hello", MB_OK);
    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
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    J'avais lu ton code trop vite. Tu mélanges C et C++. Si tu utilises CComPtr, utilise CComPtr::CoCreateInstance.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut
    J'ai évolué , mon erreur venait du contenu de la méthode SayHello:
    soit je ne cochait pas le OK de la boite de dialogue (oups) pour continuer soit j'y avais écrit d'autres lignes erronées avant d'avoir simplifié son contenu.
    Mais, en mode debugage j'obtiens tOUJOURS un "No Name" Error comme avant , même si ma méthode SayHello est appelée et elle retourne BIEN 1 !
    Donc tout a l'air d'aller bien sauf cette histoire de 'First-Exception 0x000006B5: No Name'.
    ??

    Quant à l'utilisation de CComPtr::CoCreateInstance, j'ai des erreurs de type:
    error CComPtr: use of class Template requires template argument list. See declaration of CComPtr.
    et du genre :
    illegal call of non-static member...

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Tu l'utilises comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CComPtr<IHello> m_pHello; 
    HRESULT hr = m_pHello.CoCreateInstance(CLSID_Hello);
    if( SUCCEEDED(hr) )
    {
        m_pHello->SayHello();
    }

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 6
    Par défaut
    j'avais mal compris.
    J'ai codé comme proposé, et au final le résultat reste le même.
    J'ai toujours une erreur du genre 'First-chance in Client.exe (KERNEL32.DLL) 0x000006B5: No Name'.
    (SayHello est appelé et retourne 1).

  15. #15
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ben l'erreur est ailleurs alors. Utilise le débogueur.

Discussions similaires

  1. client com très lent
    Par 3aychoucha dans le forum MFC
    Réponses: 0
    Dernier message: 15/11/2010, 14h37
  2. Serveur/client COM sur des PC différents
    Par sylvain.cool dans le forum C++Builder
    Réponses: 9
    Dernier message: 28/03/2008, 16h24
  3. Réponses: 1
    Dernier message: 02/10/2007, 10h38
  4. Réponses: 9
    Dernier message: 27/06/2007, 10h43
  5. Client COM dans un composant VCL
    Par BrunoMolto dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/12/2005, 18h36

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