サンプル オブジェクトの実装

適用対象: Outlook 2013 | Outlook 2016

シンク オブジェクト ( IMAPIAdviseSink をサポートするオブジェクト : IUnknown インターフェイス) は、クライアント アプリケーションが通知を処理するために実装する MAPI オブジェクトです。 IMAPIAdviseSinkIUnknown から直接継承され、 OnNotify メソッドが 1 つだけ含まれています。 したがって、アドバイズ シンク オブジェクトを実装するために、クライアントは IUnknownOnNotify の 3 つのメソッドのコードを作成します。

Mapidefs.h ヘッダー ファイルは、次のように、DECLARE_MAPI_INTERFACEを使用して IMAPIAdviseSink インターフェイスの実装を定義します。

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

シンク オブジェクトを実装するクライアントは、オブジェクト内のインターフェイスを手動で定義するか、 MAPI_IUNKNOWN_METHODS マクロと MAPI_IMAPIADVISESINK_METHODS マクロを使用して定義できます。 オブジェクト実装者は、可能な限りインターフェイス マクロを使用して、オブジェクト間の一貫性を確保し、時間と労力を節約する必要があります。

IUnknown::AddRef メソッドと IUnknown::Release メソッドの実装は比較的簡単です。通常、必要なコードは数行だけなのでです。 そのため、オブジェクトを実装するクライアントとサービス プロバイダーは、 AddRefRelease の実装をインラインで行うことができます。 次のコードは、 AddRefRelease のインライン実装を使用して C++ アドバイズ シンク オブジェクトを定義する方法を示しています。

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;
};
 

C では、アドバイズ シンク オブジェクトは次の要素で構成されます。

  • IUnknown および IMAPIAdviseSink の各メソッドの実装へのポインターを含む vtable へのポインター。

  • データ メンバー。

次のコード例は、C でアドバイズ シンク オブジェクトを定義し、その vtable を構築する方法を示しています。

// 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
};
 

C でオブジェクトを宣言した後、次のコードに示すように、構築された vtable のアドレスに vtable ポインターを設定して、オブジェクトを初期化する必要があります。

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

関連項目