サンプル オブジェクトの実装
適用対象: Outlook 2013 | Outlook 2016
シンク オブジェクト ( IMAPIAdviseSink をサポートするオブジェクト : IUnknown インターフェイス) は、クライアント アプリケーションが通知を処理するために実装する MAPI オブジェクトです。 IMAPIAdviseSink は IUnknown から直接継承され、 OnNotify メソッドが 1 つだけ含まれています。 したがって、アドバイズ シンク オブジェクトを実装するために、クライアントは IUnknown と OnNotify の 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 メソッドの実装は比較的簡単です。通常、必要なコードは数行だけなのでです。 そのため、オブジェクトを実装するクライアントとサービス プロバイダーは、 AddRef と Release の実装をインラインで行うことができます。 次のコードは、 AddRef と Release のインライン実装を使用して 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;