Implementar un objeto de muestra

Hace referencia a: Outlook 2013 | Outlook 2016

Los objetos receptores de aviso( objetos que admiten la interfaz IMAPIAdviseSink : IUnknown ) son objetos MAPI que las aplicaciones cliente implementan para procesar notificaciones. IMAPIAdviseSink hereda directamente de IUnknown y solo contiene un método, OnNotify. Por lo tanto, para implementar un objeto receptor advise, un cliente crea código para los tres métodos en IUnknown y para OnNotify.

El archivo de encabezado Mapidefs.h define una implementación de interfaz IMAPIAdviseSink mediante DECLARE_MAPI_INTERFACE, como se indica a continuación:

#define      INTERFACE  IMAPIAdviseSink
DECLARE_MAPI_INTERFACE_(IMAPIAdviseSink, IUnknown)
{
    BEGIN_INTERFACE
    MAPI_IUNKNOWN_METHODS(PURE)
    MAPI_IMAPIADVISESINK_METHODS(PURE)
};
 

Los clientes que implementan objetos receptores de aviso pueden definir sus interfaces en sus objetos manualmente o con las macros MAPI_IUNKNOWN_METHODS y MAPI_IMAPIADVISESINK_METHODS . Los implementadores de objetos deben usar las macros de interfaz siempre que sea posible para garantizar la coherencia entre los objetos y para ahorrar tiempo y esfuerzo.

Implementar los métodos IUnknown::AddRef e IUnknown::Release es relativamente sencillo porque normalmente solo se necesitan algunas líneas de código. Por lo tanto, los clientes y proveedores de servicios que implementan objetos pueden hacer que sus implementaciones AddRef y Release se inserten. En el código siguiente se muestra cómo definir un objeto receptor de advertencia de C++ con implementaciones insertadas de AddRef y Release.

class  CMAPIAdviseSink : public IMAPIAdviseSink
{
public:
    STDMETHODIMP QueryInterface
                    (REFIID                     riid,
                     LPVOID *                   ppvObj);
    inline STDMETHODIMP_(ULONG) AddRef
                    () { InterlockedIncrement(m_cRef);
                         ++m_cRef;
                         InterlockedDecrement(m_cRef);
                         return m_cRef; };
    inline STDMETHODIMP_(ULONG) Release
                    () { InterlockedIncrement(m_cRef);
                         ULONG ulCount = --m_cRef;
                         InterlockedDecrement(m_cRef);
                         if (!ulCount)  delete this;
                         return ulCount;};
    MAPI_IMAPIADVISESINK_METHODS(IMPL);
    BOOL WINAPI AddConnection (LPMDB pMDBObj, ULONG ulConnection);
    void WINAPI RemoveAllLinks (LPMDB pMDBObj);
// Constructors and destructors.
public :
    inline CMAPIAdviseSink  (CStoreClient * pStore)
                            { m_cRef = 1;
                              m_ulConnection = 0;
                              m_pStore = pStore;
                              AddRef;};
    ~CMAPIAdviseSink () {Release};
private :
    ULONG               m_cRef;
    CStoreClient *      m_pStore;
    ULONG               m_ulConnection;
};
 

En C, el objeto receptor advise se compone de los siguientes elementos:

  • Puntero a una tabla virtual que contiene punteros a las implementaciones de cada uno de los métodos de IUnknown e IMAPIAdviseSink.

  • Miembros de datos.

En el ejemplo de código siguiente se muestra cómo definir un objeto receptor advise en C y construir su tabla virtual.

// Object definition.
typedef struct _ADVISESINK
{
    const ADVISE_Vtbl FAR *    lpVtbl;
    ULONG             cRef;
    STORECLIENT      *pStore;
    ULONG             ulConnection;
} ADVISESINK, *LPADVISESINK;
// vtable definition.
static const ADVISE_Vtbl vtblADVISE =
{
    ADVISE_QueryInterface,
    ADVISE_AddRef,
    ADVISE_Release,
    ADVISE_OnNotify
};
 

Después de declarar un objeto en C, debe inicializarlo estableciendo el puntero vtable en la dirección de la tabla virtual construida, como se muestra en el código siguiente:

LPADVISESINK lpMyObj = NULL;
HRESULT hr = (*lpAllocateBuffer) (sizeof(ADVISESINK),
                 (LPVOID *)&lpMyObj);
lpMyObj->lpVtbl = &vtblADVISE;
 

Vea también