Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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;