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

Visual C++ Discussion :

Héritage multiple pour les ATL


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 55
    Points : 37
    Points
    37
    Par défaut Héritage multiple pour les ATL
    Bonjour,

    Après avoir consulter la documentation sur les DCOM et OLE et ATL, je ne trouve pas la réponse à une de mes questions.

    Voici rapidement mon PB :

    Nous possédons une DLL dans notre entreprise avec laquelle nous gérons nos envois de mails pour notre logiciel notamment.

    Cette DLL possède des classes accessibles en COM et je souhaiterais ajouter une fonction a ma classe gérant les mails permettant de rajouter une balise ReplyTo.
    Ce que je souhaite en faire n'a pas d'importance.

    J'ai cru comprendre dans la documentation qu'il n'est pas possible de modifier une interface ni de rendre accessible en COM une fonction d'une classe sans que celleci n'hérite d'une interface.

    J'ai donc crée une interface IReplyTo avec le Wizard de VC 6.0 et ajouter une fonction : putReplyTo

    Voici les fichiers générés :



    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
    // ReplyTo.cpp : Implementation of CReplyTo
    #include "stdafx.h"
    #include "FlxTBox.h"
    #include "ReplyTo.h"
     
    /////////////////////////////////////////////////////////////////////////////
    // CReplyTo
     
     
    STDMETHODIMP CReplyTo::putReplyTo(BSTR newVal)
    {
    	AFX_MANAGE_STATE(AfxGetStaticModuleState())
     
    	// TODO: Add your implementation code here
     
    	// Je ne mets rien ici, parce que je fais hériter SMTPLevel de IReplyTo
    	// et c'est dans son corps que je surcharge la fonction putReplyTO
     
    	return S_OK;
    }
    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
    // ReplyTo.h : Declaration of the CReplyTo
     
    #ifndef __REPLYTO_H_
    #define __REPLYTO_H_
     
    #include "resource.h"       // main symbols
     
    /////////////////////////////////////////////////////////////////////////////
    // CReplyTo
    class ATL_NO_VTABLE CReplyTo : 
    	public CComObjectRootEx<CComSingleThreadModel>,
    	public CComCoClass<CReplyTo, &CLSID_ReplyTo>,
    	public IDispatchImpl<IReplyTo, &IID_IReplyTo, &LIBID_FLXTBOXLib>
    {
    public:
    	CReplyTo()
    	{
    	}
     
    DECLARE_REGISTRY_RESOURCEID(IDR_REPLYTO)
     
    DECLARE_PROTECT_FINAL_CONSTRUCT()
     
    BEGIN_COM_MAP(CReplyTo)
    	COM_INTERFACE_ENTRY(IReplyTo)
    	COM_INTERFACE_ENTRY(IDispatch)
    END_COM_MAP()
     
    // IReplyTo
    public:
    	STDMETHOD(putReplyTo)(BSTR newVal);
    };
     
    #endif //__REPLYTO_H_

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [
    		object,
    		uuid(19539996-F8CA-4114-B9EB-4BF5AD1A8EA7),
    		dual,
    		helpstring("IReplyTo Interface"),
    		pointer_default(unique)
    	]
    	interface IReplyTo : IDispatch
    	{
    		[id(1), helpstring("method putReplyTo")] HRESULT putReplyTo(BSTR newVal);
    	};
    Voici un morceau de mon SMTPLevel.h :


    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
     
    class CSMTPLevel : 
    	public IDispatchImpl<ISMTPLevel, &IID_ISMTPLevel, &LIBID_FLXTBOXLib>, 
    	public ISupportErrorInfo,
    	public CComObjectRoot,
    	public CComCoClass<CSMTPLevel,&CLSID_SMTPLevel>,
    	////********public IReplyTo***////
    {
    public:
    	CSMTPLevel() {
    		m_dwPort=25;		
    		m_connected=FALSE;
    		m_dwAttachmentCounter=0;		
    		smtpmessage = new CSMTPMessage;
    		smtpconnexion = new CSMTPConnection;			
    		smtpmessage->m_Priority = 0;
    	}
    	~CSMTPLevel() {
    		delete smtpmessage ;
    		delete smtpconnexion ;
    	}
     
    BEGIN_COM_MAP(CSMTPLevel)
    	COM_INTERFACE_ENTRY(IDispatch)
    	COM_INTERFACE_ENTRY(ISMTPLevel)
    ///*****        COM_INTERFACE_ENTRY(IReplyTo)***///
    	COM_INTERFACE_ENTRY(ISupportErrorInfo)
     
    END_COM_MAP()
    Comment faire hériter ma classe CSMTPLevel de l'interface IReplyto pour y surcharger ma méthode puReplyto et pouvoir l'utiliser ensuite en COM.

    Merci d'avance pour vos conseils.

  2. #2
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Extrait de MSDN

    ATL Library Reference
    Multiple Dual Interfaces

    You may want to combine the advantages of a dual interface (that is, the flexibility of both vtable and late binding, thus making the class available to scripting languages as well as C++) with the techniques of multiple inheritance.

    Although it is possible to expose multiple dual interfaces on a single COM object, it is not recommended. If there are multiple dual interfaces, there must be only one IDispatch interface exposed. The techniques available to ensure that this is the case carry penalties such as loss of function or increased code complexity. The developer considering this approach should carefully weigh the advantages and disadvantages.

    Exposing a Single IDispatch Interface
    It is possible to expose multiple dual interfaces on a single object by deriving from two or more specializations of IDispatchImpl. However, if you allow clients to query for the IDispatch interface, you will need to use the COM_INTERFACE_ENTRY2 macro (or COM_INTERFACE_ENTRY_IID) to specify which base class to use for the implementation of IDispatch.

    Copy Code
    COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)


    Because only one IDispatch interface is exposed, clients that can only access your objects through the IDispatch interface will not be able to access the methods or properties in any other interface.

    Combining Multiple Dual Interfaces into a Single Implementation of IDispatch
    ATL does not provide any support for combining multiple dual interfaces into a single implementation of IDispatch. However, there are several known approaches to manually combining the interfaces, such as creating a templated class that contains a union of the separate IDispatch interfaces, creating a new object to perform the QueryInterface function, or using a typeinfo-based implementation of nested objects to create the IDispatch interface.

    These approaches have problems with potential namespace collisions, as well as code complexity and maintainability. It is not recommended that you create multiple dual interfaces.

    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
    class CSMTPLevel : 
    	public IDispatchImpl<ISMTPLevel, &IID_ISMTPLevel, &LIBID_FLXTBOXLib>, 
    	public ISupportErrorInfo,
    	public CComObjectRoot,
    	public CComCoClass<CSMTPLevel,&CLSID_SMTPLevel>,
            public IDispatchImpl< IReplyTo, &IID_IReplyTo, &LIBID_FLXTBOXLib>
    {
    public:
    	CSMTPLevel() {
    		m_dwPort=25;		
    		m_connected=FALSE;
    		m_dwAttachmentCounter=0;		
    		smtpmessage = new CSMTPMessage;
    		smtpconnexion = new CSMTPConnection;			
    		smtpmessage->m_Priority = 0;
    	}
    	~CSMTPLevel() {
    		delete smtpmessage ;
    		delete smtpconnexion ;
    	}
     
    BEGIN_COM_MAP(CSMTPLevel)
    	COM_INTERFACE_ENTRY(IDispatch)
            COM_INTERFACE_ENTRY2(IDispatch, ISMTPLevel)  // this main interface by default
    	COM_INTERFACE_ENTRY(IReplyTo)
    	COM_INTERFACE_ENTRY(ISupportErrorInfo)
    	
    END_COM_MAP()
    Voilà, tu crées une seconde interface IReplyTo du même objet COM CSMTPLevel.

    Take it

Discussions similaires

  1. Requetes sur tables multiples ! Pour les 'gurus'
    Par bandicoq dans le forum Langage SQL
    Réponses: 5
    Dernier message: 07/08/2008, 12h39
  2. Héritage multiple : Pour ou contre
    Par JolyLoic dans le forum C++
    Réponses: 35
    Dernier message: 15/05/2008, 10h25
  3. Réponses: 19
    Dernier message: 13/07/2006, 14h35

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