Implementieren eines Beispielsobjekts

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;
 

Siehe auch