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

C++ Discussion :

Développement d'un composant COM


Sujet :

C++

Vue hybride

inertia Développement d'un composant... 24/05/2006, 14h29
inertia D'après UnKnown.idl... 24/05/2006, 16h44
inertia A tout hasard j'ai cherché... 24/05/2006, 16h54
moldavi C'est bien dans la... 24/05/2006, 20h20
Luc Hermitte Forum dev windows ou VC++.... 24/05/2006, 20h48
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut Développement d'un composant COM
    Bonjour, je cherche a créer un composant utilisant la norme COM, j'ai lu et suivi le document du MSDN "The COM Programmer's Cookbook"

    lien : http://msdn.microsoft.com/library/en...sdn_com_co.asp

    J'ai créé une interface de test, j'ai compilé avec MIDL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import "oaidl.idl";
    import "ocidl.idl";
     
    //typedef [string] char line[81]; 
     
    [ object, uuid(A46C12C0-4E88-11ce-A6F1-00AA0037DEFB) ]
    interface ITest : IUnknown
    {
        HRESULT showMessage ([in, string] char * msg);
    };
    LA compilation m'a produit 4 fichiers : dlldata.c, ITest_i.c, ITest_p.c, ITest.h

    ------------------------

    J'ai ensuite tenté de créer un contrôle qui implémenterait cette interface :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #include <objbase.h>
    #include "ITest.h"
     
    int vcObjects = 0;
     
    // Création du composant :
    struct CMyComponent : ITest
    {
     
        // IUnknown methods
        HRESULT __stdcall QueryInterface (REFIID riid, void **ppv);
        ULONG __stdcall AddRef (void);
     
        ULONG __stdcall Release (void);
     
     
        // ITest methods
        HRESULT __stdcall showMessage( unsigned char *msg);
     
        // constructeur
        CMyComponent();
     
        // membres
        int m_cRef;
     
    };
     
     
    /***********************************************************
     * QueryInterface
     ***********************************************************/
    HRESULT CMyComponent::QueryInterface (REFIID riid, void **ppv)
    {
        if (riid == IID_IUnknown || riid == IID_ITest)
            *ppv = (ITest *) this;
        else
        {
            *ppv = 0;
            return E_NOINTERFACE;
        }    
     
     
        ((IUnknown *)*ppv)->AddRef ();
        return NOERROR;
    }
     
    /***********************************************************
     * AddRef
     ***********************************************************/
    ULONG CMyComponent::AddRef (void)
    {
        return ++ m_cRef;
    }
     
    /***********************************************************
     * Release
     ***********************************************************/
    ULONG CMyComponent::Release (void)
    {
        if (--m_cRef == 0)
        {
            --vcObjects;
     
            delete this;
            return 0;
        }
        return m_cRef;
    }
     
    /***********************************************************
     * showMessage
     ***********************************************************/
    HRESULT CMyComponent::showMessage(unsigned char *msg)
    {
        MessageBox(NULL, (LPCSTR)msg, "Message COM", MB_OK);
     
        return NOERROR;
    }
     
    /***********************************************************
     * Constructeur
     ***********************************************************/
    inline CMyComponent::CMyComponent (void)
    {
        m_cRef = 1;
        ++vcObjects;
    }
     
     
    extern "C" HRESULT CreateAvolute (IUnknown *punkOuter, REFIID riid, void **ppv)
    {
        CMyComponent *pout;
        *ppv = 0;
        if (punkOuter)
             return CLASS_E_NOAGGREGATION;
        if (!(pout = new CMyComponent))
            return E_OUTOFMEMORY;
        HRESULT hr = pout->QueryInterface (riid, ppv);
     
        pout->Release ();
        return hr;
    }
    je veux juste faire un composant qui aurait une méthode qui affiche un texte via une msgbox.

    lorsque je compile j'obtient un : error LNK2001: unresolved external symbol _IID_ITest

    IID_ITest est pourtant bien définie dans ITest.h (généré par MIDL) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXTERN_C const IID IID_ITest;
    je ne sais pas pourquoi il le défini en EXTERN mais visiblement ça pose pb.

    Pour info : je suis sous XP avec Visual studio 8 et j'ai créer unn projet de type DLL extended stored procedure en enlevant les fichiers relatif aux base de données, ne sachant pas quel projet chosir pour créer un composant COM.

    J'ai l'impression que des paramètres manquent dans la config de mon projet et que le linker ne si retrouve pas.

    Pour tester j'ai remplacé
    "EXTERN_C const IID IID_ITest" par "const IID IID_ITest" dans Itest.h et j'ai continué à programmer. Au moment, d'utiliser une macro microsoft faisant elle aussi appelle a des extern C ca a planté au linkage :

    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
    // {A46C12C0-4E88-11ce-A6F1-00AA0037DEFB}
    DEFINE_GUID(CLSID_Avolute, 0xa46c12c0, 0x4e88, 0x11ce, 0xa6, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0xde, 0xfb);
     
     
    void createComposantTest(){
     
     
        // création d'un composant COM 
        ITest *pTest;
        HRESULT hr;
        int result;
     
        // initialisation de COM
        hr = CoInitialize(NULL);
     
        hr = CoCreateInstance(CLSID_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyComponent, NULL, CLSCTX_SERVER, IID_ITest, (LPVOID *)&pTest);
            // ....
            pTest->showMessage((unsigned char*)"message test");
    
    }


    Je ne comprend pas les erreurs de linkage. Déjà que je comprend pas trop COM, je galère un max là.

    julien

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    D'après UnKnown.idl (linterface mère des composant COM) dans les includes VC++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cpp_quote("// IID_IUnknown and all other system IIDs are provided in UUID.LIB")
    cpp_quote("// Link that library in with your proxies, clients and servers")
    c'est donc init autre part.

    Dois je en conclure que je dois définir et initialiser mon IID_Itest qq part afin que de la même manière il soit appelé en extern dans le header généré automatiquement ?

    Pas de developpeur COM dans le forum ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    A tout hasard j'ai cherché IID et COm dans MSDN et visiblement il faut inclure le fichier interface_i.c, le IID est initialisé dedans

    Merci microsoft, faut tout deviner ? pas très claire la doc MIDL

  4. #4
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Citation Envoyé par inertia
    A tout hasard j'ai cherché IID et COm dans MSDN et visiblement il faut inclure le fichier interface_i.c, le IID est initialisé dedans

    Merci microsoft, faut tout deviner ? pas très claire la doc MIDL
    C'est bien dans la documentation du site que tu as donné précédemment, au tout début:


    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
    #include <objbase.h>
     
    #undef INTERFACE
    #define INTERFACE IFoo
     
    DECLARE_INTERFACE_ (IFoo, IUnknown)
    {
        // IUnknown methods
        STDMETHOD (QueryInterface)   (THIS_  REFIID, void **) PURE;
        STDMETHOD_(ULONG, AddRef)    (THIS) PURE;
        STDMETHOD_(ULONG, Release)   (THIS) PURE;
     
        STDMETHOD (SetValue)         (THIS_  int) PURE;
        STDMETHOD (GetValue)         (THIS_  int *) PURE;
    };
     
    // {A46C12C0-4E88-11ce-A6F1-00AA0037DEFB}
    DEFINE_GUID(IID_IFoo, 0xa46c12c0, 0x4e88, 0x11ce, 0xa6, 0xf1, 0x0, 0xaa, 0x0, 0x37, 0xde, 0xfb);
    La macro DEFINE_GUID remplit le même rôle.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 293
    Par défaut
    Forum dev windows ou VC++.
    Il y avait de très bons bouquins pour démarrer rapidement avec COM chez Wrox.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    Moldavi, en fait oui la macro de la doc déclare le GUID seulement tu remarquera que c'est pour le mec qui a déjà de l'expérience en COM et qui code direct son interface dans un .H.

    Moi j'ai utilisé MIDL qui génére tout et dans le fichier interface_i.c qui manqué la macro MIDL_CREATE_GUID où un truc comme ça est appelée, Ya 2-3 moyen de définir son interface avec COM visiblement.


    Je vais allez jetter un oeil dans le forum dev windows.

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

Discussions similaires

  1. Langages de développement pour les Composant Com et ActiveX
    Par Pilloutou dans le forum Composants VCL
    Réponses: 1
    Dernier message: 16/08/2006, 22h59
  2. [VB] Problème composants COM Word
    Par Vince dans le forum VBA Word
    Réponses: 5
    Dernier message: 08/12/2005, 10h18
  3. Réponses: 4
    Dernier message: 03/08/2005, 14h02
  4. [C#] C# et composant COM
    Par beway dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/11/2004, 08h56
  5. Composant COM et style XP
    Par Reisubar dans le forum Composants VCL
    Réponses: 7
    Dernier message: 10/11/2003, 19h23

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