Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: Outlook 2013 | Outlook 2016
Beratungssenkenobjekte – Objekte, die die IMAPIAdviseSink : IUnknown-Schnittstelle unterstützen – sind MAPI-Objekte, die Clientanwendungen für die Verarbeitung von Benachrichtigungen implementieren. IMAPIAdviseSink erbt direkt von IUnknown und enthält nur eine Methode, OnNotify. Daher erstellt ein Client code für die drei Methoden in IUnknown und für OnNotify, um ein Beratungssenkenobjekt zu implementieren.
Die Headerdatei Mapidefs.h definiert eine IMAPIAdviseSink-Schnittstellenimplementierung mithilfe von DECLARE_MAPI_INTERFACE wie folgt:
#define INTERFACE IMAPIAdviseSink
DECLARE_MAPI_INTERFACE_(IMAPIAdviseSink, IUnknown)
{
BEGIN_INTERFACE
MAPI_IUNKNOWN_METHODS(PURE)
MAPI_IMAPIADVISESINK_METHODS(PURE)
};
Clients, die Beratungssenkenobjekte implementieren, können ihre Schnittstellen in ihren Objekten manuell oder mit den makros MAPI_IUNKNOWN_METHODS und MAPI_IMAPIADVISESINK_METHODS definieren. Objektimplementierer sollten die Schnittstellenmakros nach Möglichkeit verwenden, um die Konsistenz zwischen Objekten sicherzustellen und Zeit und Aufwand zu sparen.
Die Implementierung der Methoden IUnknown::AddRef und IUnknown::Release ist relativ einfach, da in der Regel nur wenige Codezeilen benötigt werden. Daher können Clients und Dienstanbieter, die Objekte implementieren, ihre AddRef - und Release-Implementierungen inline erstellen. Der folgende Code zeigt, wie Sie ein C++-Beratungssenkenobjekt mit Inlineimplementierungen von AddRef und Release definieren.
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;
};
In C besteht das Objekt der Empfehlungssenke aus den folgenden Elementen:
Ein Zeiger auf eine vtable, die Zeiger auf Implementierungen der einzelnen Methoden in IUnknown und IMAPIAdviseSink enthält.
Datenmember.
Im folgenden Codebeispiel wird veranschaulicht, wie sie ein Beratungssenkenobjekt in C definieren und dessen VTable erstellen.
// 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
};
Nachdem Sie ein Objekt in C deklariert haben, müssen Sie es initialisieren, indem Sie den vtable-Zeiger auf die Adresse der erstellten VTable festlegen, wie im folgenden Code gezeigt:
LPADVISESINK lpMyObj = NULL;
HRESULT hr = (*lpAllocateBuffer) (sizeof(ADVISESINK),
(LPVOID *)&lpMyObj);
lpMyObj->lpVtbl = &vtblADVISE;