コンポーネント オブジェクト モデルおよび MAPIComponent Object Model and MAPI

適用されます: OutlookApplies to: Outlook

Windows SDK ドキュメントには、コンポーネント オブジェクト モデル (COM) に準拠しているオブジェクトを実装するための規則の包括的な説明が含まれています。The Windows SDK documentation includes a comprehensive discussion of the rules for implementing objects that conform to the Component Object Model (COM). これらの規則は、以下を実行する方法を対処します。These rules address how to do the following:

  • インターフェイスとオブジェクトを設計します。Design interfaces and objects.

  • IUnknownインターフェイスを実装します。Implement the IUnknown interface.

  • メモリを管理します。Manage memory.

  • 参照カウントを処理します。Handle reference counting.

  • アパートメント スレッド オブジェクトを実装します。Implement apartment-threaded objects.

すべての MAPI オブジェクトと見なされます com IUnknownから継承するインターフェイスを実装するため、MAPI は、状況によっては標準の COM の規則からの逸脱します。Although all MAPI objects are considered COM-based because they implement interfaces that inherit from IUnknown, MAPI deviates in some situations from the standard COM rules. この偏差から、開発者は、実装でより柔軟にすることができます。This deviation allows developers more flexibility in their implementations. などの任意の COM インターフェイスと同様に、MAPI インターフェイスでは、作成者と呼び出し元のコントラクトについて説明します。For example, a MAPI interface, like any COM interface, describes a contract between implementer and caller. インタ フェースが作成され、公開、その定義はことはできず、変更されません。Once the interface is created and published, its definition cannot and does not change. この説明では、MAPI が外れていないが、説明を多少緩和します。MAPI does not deviate from this description, but it relaxes the description somewhat. 実装では特定のメソッドを実装するのにはエラー値は次のいずれかを呼び出し元に返すことができます。Implementers can choose to not implement particular methods, returning one of the following error values to the caller:

  • MAPI_E_NO_SUPPORTMAPI_E_NO_SUPPORT

  • MAPI_E_TOO_COMPLEXMAPI_E_TOO_COMPLEX

  • MAPI_E_BAD_CHARWIDTHMAPI_E_BAD_CHARWIDTH

  • MAPI_E_TYPE_NO_SUPPORTMAPI_E_TYPE_NO_SUPPORT

標準の COM の規則からの偏差は、次の表に説明します。The other deviations from the standard COM rules are described in the following table.

COM プログラミングの規則COM programming rule MAPI のバリエーションMAPI variation
インターフェイスのメソッド内のすべての文字列パラメーターには、Unicode をする必要があります。All string parameters in interface methods should be Unicode.
MAPI インターフェイスは、Unicode または ANSI のいずれかの文字列パラメーターを許可するように定義されます。MAPI interfaces are defined to permit either Unicode or ANSI string parameters. 文字列パラメーターをとるメソッドの多くもパラメーターを持つ、 ulFlagsです。ulFlagsに MAPI_UNICODE フラグの値の文字列パラメーターの幅が表示されます。Many methods that have a string parameter also have a ulFlags parameter; the width of a string parameter is indicated by the value of the MAPI_UNICODE flag in ulFlags. 一部の MAPI インターフェイスをサポートしない Unicode MAPI_UNICODE フラグが設定されている場合は、MAPI_E_BAD_CHARWIDTH を返します。Some MAPI interfaces do not support Unicode and return MAPI_E_BAD_CHARWIDTH when the MAPI_UNICODE flag is set.
すべてのインターフェイス メソッドは、HRESULT の戻り値の型が必要です。All interface methods should have a return type of HRESULT.
MAPI 以外の HRESULT 値を返すには、少なくとも 1 つのメソッドを持つ: IMAPIAdviseSink::OnNotifyMAPI has at least one method that returns a non-HRESULT value: IMAPIAdviseSink::OnNotify.
呼び出し元および実装する必要があります解放し、メモリ インタ フェースのパラメーターの標準的な COM タスク アロケーターを使用しています。Callers and implementers should allocate and free memory for interface parameters by using the standard COM task allocators.
MAPI のすべてのメソッドは、インターフェイスのパラメーター用のメモリを管理するためにMAPIAllocateBufferMAPIAllocateMore、およびMAPIFreeBufferは、リンクされたアロケーターを使用します。All MAPI methods use the linked allocators MAPIAllocateBuffer, MAPIAllocateMore, and MAPIFreeBuffer to manage memory for interface parameters. IStreamなど、OLE によって定義されたインターフェイスのすべての MAPI 実装では、標準的な COM タスク アロケーターを使用します。All MAPI implementations of interfaces defined by OLE, such as IStream, use the standard COM task allocators.
すべてのポインター パラメーターする必要があります明示的に設定する NULL にメソッドが失敗したとき。All out pointer parameters must explicitly be set to NULL when a method fails.
MAPI インターフェイスでは、ポインター パラメーターを NULL に設定または変更しないままメソッドを配置するかを失敗する必要があります。MAPI interfaces require that out pointer parameters either be set to NULL or remain unchanged when a method fails. OLE によって明示的に定義されているインタ フェースのすべての MAPI 実装では、失敗した場合に null パラメーターを設定します。All MAPI implementations of interfaces defined by OLE explicitly set out parameters to NULL on failure.
可能な限り、集約可能オブジェクトを実装します。Implement aggregatable objects whenever possible.
MAPI インターフェイスは、集約可能ではありません。MAPI interfaces are not aggregatable.

関連項目See also

MAPIAllocateBufferMAPIAllocateBuffer

MAPIAllocateMoreMAPIAllocateMore

MAPIFreeBufferMAPIFreeBuffer

MAPI オブジェクトとインターフェイスの概要MAPI Object and Interface Overview