サンプル オブジェクトを実装します。Implementing a sample object

適用されます: OutlookApplies to: Outlook

通知シンク オブジェクト-オブジェクトをサポートする、 IMAPIAdviseSink: IUnknownインターフェイス-は、MAPI オブジェクトの通知を処理するためのクライアント アプリケーションを実装することです。Advise sink objects — objects that support the IMAPIAdviseSink : IUnknown interface — are MAPI objects that client applications implement for processing notifications. IMAPIAdviseSinkでは、 IUnknownから直接継承し、 OnNotify1 つのメソッドが含まれています。IMAPIAdviseSink inherits directly from IUnknown and contains only one method, OnNotify. したがって、アドバイズ シンク オブジェクトを実装するには、クライアントはIUnknownの 3 つの方法とOnNotifyコードを作成します。Therefore, to implement an advise sink object, a client creates code for the three methods in IUnknown and for OnNotify.

Mapidefs.h ヘッダー ファイルでは、次のようにDECLARE_MAPI_INTERFACEを使用して、 IMAPIAdviseSinkインターフェイスの実装を定義します。The Mapidefs.h header file defines an IMAPIAdviseSink interface implementation by using DECLARE_MAPI_INTERFACE, as follows:

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

実装するクライアントは、シンク オブジェクトは、手動でまたはMAPI_IUNKNOWN_METHODSMAPI_IMAPIADVISESINK_METHODSのマクロを使用に、そのオブジェクトのインタ フェースを定義できますを案内します。Clients that implement advise sink objects can define their interfaces in their objects manually or with the MAPI_IUNKNOWN_METHODS and MAPI_IMAPIADVISESINK_METHODS macros. オブジェクトの実装は、オブジェクト間での整合性を確保し、時間と労力を節約するのには可能な限りインターフェイスのマクロを使用してください。Object implementers should use the interface macros whenever possible to ensure consistency across objects and to save time and effort.

通常はわずか数行のコードが必要なために、 IUnknown::AddRefリ スのメソッドの実装は比較的簡単です。Implementing the IUnknown::AddRef and IUnknown::Release methods is relatively simple because typically only a few lines of code are needed. したがって、クライアントとオブジェクトを実装するサービス プロバイダーは、 AddRefおよびReleaseの実装のインラインを作成できます。Therefore, clients and service providers that implement objects can make their AddRef and Release implementations inline. 次のコードは、C++ を定義する方法を示しますAddRefおよびReleaseのインライン実装のシンク オブジェクトに通知します。The following code shows how to define a C++ advise sink object with inline implementations of AddRef and 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;
};
 

C では、アドバイズ シンク オブジェクトは、次の要素で構成されます。In C, the advise sink object is composed of the following elements:

  • IUnknownIMAPIAdviseSink内のメソッドの実装へのポインターが含まれている vtable へのポインター。A pointer to a vtable that contains pointers to implementations of each of the methods in IUnknown and IMAPIAdviseSink.

  • データ メンバーです。Data members.

次のコード例では、C のアドバイズ シンク オブジェクトを定義し、v テーブルを作成する方法を示します。The following code example shows how to define an advise sink object in C and construct its 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 のアドレスに設定することで次のコードに示すように。After you declare an object in C, you must initialize it by setting the vtable pointer to the address of the constructed vtable, as shown in the following code:

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

関連項目See also