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:
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:
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:
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:
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.