C 言語でオブジェクトを実装します。Implementing objects in C

適用されます: OutlookApplies to: Outlook

クライアント アプリケーションとサービス プロバイダーが C で書かれたデータ構造体と、仮想関数テーブルまたは vtable と呼ばれる順序付けられた関数ポインターの配列を作成することで MAPI オブジェクトを定義します。Client applications and service providers written in C define MAPI objects by creating a data structure and an array of ordered function pointers known as a virtual function table, or vtable. Vtable へのポインターは、データ構造体の最初のメンバーである必要があります。A pointer to the vtable must be the first member of the data structure.

V のテーブル自体は、オブジェクトでサポートされている各インタ フェースのすべてのメソッドの 1 つのポインターがあります。In the vtable itself, there is one pointer for every method in each interface supported by the object. ポインターの順序は、Mapidefs.h ヘッダー ファイルで公開されているインターフェイスの仕様内のメソッドの順序に従う必要があります。The order of the pointers must follow the order of the methods in the interface specification published in the Mapidefs.h header file. Vtable 内の各関数ポインターは、実際のメソッドの実装のアドレスに設定されています。Each function pointer in the vtable is set to the address of the actual implementation of the method. C++ では、コンパイラは、vtable を自動的に設定します。In C++, the compiler automatically sets up the vtable. C ではないです。In C, it does not.

次の図は、このしくみを示しています。The following illustration shows how this works. 一番左のボックスでは、サービス プロバイダー オブジェクトを使用する必要があるクライアントを表します。The box on the far left represents a client that needs to use a service provider object. セッションでは、クライアントは、 lpObjectオブジェクトへのポインターを取得します。Through the session, the client obtains a pointer to the object, lpObject. Vtable では、プライベート データとメソッドの後にオブジェクトの最初の項目が表示されます。The vtable appears first in the object followed by private data and methods. Vtable ポインターが指す実際の vtable は、の各インターフェイスのメソッドの実装へのポインターが含まれています。The vtable pointer points to the actual vtable, which contains pointers to each of the implementations of the methods in the interface.

オブジェクトの実装Object implementation

オブジェクトの実装Object implementation

C のサービス プロバイダーが、単純な状態のオブジェクトを定義する方法を次のコード例に示します。The following code example shows how a C service provider can define a simple status object. 最初のメンバーは、vtable ポインターです。オブジェクトの残りの部分はデータ メンバーで構成されています。The first member is the vtable pointer; the rest of the object is made up of data members.

typedef struct _MYSTATUSOBJECT
{
    const STATUS_Vtbl FAR *lpVtbl;
    ULONG              cRef;
    ANOTHEROBJ        *pObj;
    LPMAPIPROP         lpProp;
    LPFREEBUFFER       lpFreeBuf;
} MYSTATUSOBJECT, *LPMYSTATUSOBJ;
 

それぞれのメソッドの実装へのポインターが vtable に含まれていますこのオブジェクトが状態オブジェクトであるため、 IMAPIStatus: IMAPIPropの基本インターフェイスのメソッドの実装へのポインターと同様に、インターフェイス、IUnknown の**** とIMAPIPropBecause this object is a status object, the vtable includes pointers to implementations of each of the methods in the IMAPIStatus : IMAPIProp interface, as well as pointers to implementations of each of the methods in the base interfaces — IUnknown and IMAPIProp. Vtable 内のメソッドの順序は、Mapidefs.h ヘッダー ファイルで定義されている指定された順序と一致します。The order of methods in the vtable matches the specified order as defined in the Mapidefs.h header file.

static const MYOBJECT_Vtbl vtblSTATUS =
{
    STATUS_QueryInterface,
    STATUS_AddRef,
    STATUS_Release,
    STATUS_GetLastError,
    STATUS_SaveChanges,
    STATUS_GetProps,
    STATUS_GetPropList,
    STATUS_OpenProperty,
    STATUS_SetProps,
    STATUS_DeleteProps,
    STATUS_CopyTo,
    STATUS_CopyProps,
    STATUS_GetNamesFromIDs,
    STATUS_GetIDsFromNames,
    STATUS_ValidateState,
    STATUS_SettingsDialog,
    STATUS_ChangePassword,
    STATUS_FlushQueues
};
 

クライアントとサービス プロバイダーが C で書かれた、v テーブルを通じて間接的にオブジェクトを使用し、すべての呼び出しの最初のパラメーターとして、オブジェクトのポインターを追加します。Clients and service providers written in C use objects indirectly through the vtable and add an object pointer as the first parameter in every call. MAPI インターフェイスのメソッドを呼び出すたびには、最初のパラメーターとして呼び出されているオブジェクトへのポインターが必要です。Every call to a MAPI interface method requires a pointer to the object being called as its first parameter. C++ では、この目的のため、 thisポインターと呼ばれる特殊なポインターを定義します。C++ defines a special pointer known as the this pointer for this purpose. Thisポインターは、最初のパラメーターとしてメソッド呼び出しのたびに、C++ コンパイラによって暗黙に追加します。The C++ compiler implicitly adds the this pointer as the first parameter to every method call. C ではこのようなポインターです。それを明示的に追加する必要があります。In C there is no such pointer; it must be explicitly added.

次のコードでは、クライアントが MYSTATUSOBJECT のインスタンスへの呼び出しを作成する方法を示します。The following code demonstrates how a client can make a call to an instance of MYSTATUSOBJECT:

lpMyObj->lpVtbl->ValidateState(lpMyObj, ulUIParam, ulFlags);
 

関連項目See also