ランタイム オブジェクト モデル サービス

クラス CObject および CRuntimeClass は、ランタイム クラス情報へのアクセス、シリアル化、動的オブジェクト作成など、いくつかのオブジェクト サービスをカプセル化します。 CObjectから派生したすべてのクラスは、この機能を継承します。

実行時クラス情報にアクセスすると、実行時にオブジェクトのクラスに関する情報を決定できます。 実行時にオブジェクトのクラスを決定する機能は、関数引数の追加の型チェックが必要な場合や、オブジェクトのクラスに基づいて特別な目的のコードを記述する必要がある場合に便利です。 ランタイム クラス情報は、C++ 言語では直接サポートされていません。

シリアル化は、ファイルとの間でオブジェクトの内容を書き込んだり読み取ったりするプロセスです。 シリアル化を使用すると、アプリケーションが終了した後でもオブジェクトの内容を格納できます。 その後、アプリケーションの再起動時に、オブジェクトをファイルから読み取ることができます。 このようなデータ オブジェクトは"永続的" と言われます。

動的オブジェクトの作成を使用すると、実行時に指定したクラスのオブジェクトを作成できます。 たとえば、ドキュメント オブジェクト、ビュー オブジェクト、フレーム オブジェクトは動的作成をサポートする必要があります。フレームワークでは動的に作成する必要があるためです。

次の表に、ランタイム クラス情報、シリアル化、動的作成をサポートする MFC マクロを示します。

これらのランタイム オブジェクト サービスとシリアル化の詳細については、「クラス: 実行時クラス情報へのアクセスCObjectに関する記事を参照してください。

ランタイム オブジェクト モデル サービス マクロ

名前 説明
DECLARE_DYNAMIC ランタイム クラス情報へのアクセスを有効にします (クラス宣言で使用する必要があります)。
DECLARE_DYNCREATE 動的な作成と実行時クラス情報へのアクセスを有効にします (クラス宣言で使用する必要があります)。
DECLARE_SERIAL シリアル化と実行時クラス情報へのアクセスを有効にします (クラス宣言で使用する必要があります)。
IMPLEMENT_DYNAMIC ランタイム クラス情報へのアクセスを有効にします (クラス実装で使用する必要があります)。
IMPLEMENT_DYNCREATE 動的な作成と実行時情報へのアクセスを有効にします (クラス実装で使用する必要があります)。
IMPLEMENT_SERIAL シリアル化と実行時クラス情報へのアクセスを許可します (クラス実装で使用する必要があります)。
RUNTIME_CLASS 名前付きクラスに対応する CRuntimeClass 構造体を返します。

OLE では、実行時にオブジェクトを動的に作成する必要がある場合がよくあります。 たとえば、OLE サーバー アプリケーションは、クライアントからの要求に応じて OLE アイテムを動的に作成できる必要があります。 同様に、オートメーション サーバーは、オートメーション クライアントからの要求に応じて項目を作成できる必要があります。

Microsoft Foundation クラス ライブラリには、OLE に固有の 2 つのマクロが用意されています。

OLE オブジェクトの動的作成

名前 説明
AFX_COMCTL32_IF_EXISTS Common Controls ライブラリが指定した API を実装するかどうかを決定します。
AFX_COMCTL32_IF_EXISTS2 Common Controls ライブラリが指定した API を実装するかどうかを決定します。
DECLARE_OLECREATE OLE オートメーションを使用してオブジェクトを作成できるようにします。
DECLARE_OLECTLTYPE コントロール クラスの GetUserTypeNameID および GetMiscStatus メンバー関数を宣言します。
DECLARE_PROPPAGEIDS OLE コントロールがプロパティを表示するプロパティ ページの一覧を提供することを宣言します。
IMPLEMENT_OLECREATE OLE システムでオブジェクトを作成できるようにします。
IMPLEMENT_OLECTLTYPE コントロール クラスの GetUserTypeNameID および GetMiscStatus メンバー関数を実装します。
IMPLEMENT_OLECREATE_FLAGS このマクロまたは IMPLEMENT_OLECREATE は、 DECLARE_OLECREATEを使用するすべてのクラスの実装ファイルに含まれている必要があります。

AFX_COMCTL32_IF_EXISTS

Common Controls ライブラリが指定した API を実装するかどうかを決定します。

構文

AFX_COMCTL32_IF_EXISTS(  proc );

パラメーター

proc
関数名を含む null で終わる文字列へのポインター、または関数の序数値を指定します。 このパラメーターが序数値の場合は、下位ワードに含まれている必要があります。高次ワードはゼロでなければなりません。 このパラメーターは Unicode である必要があります。

解説

このマクロを使用して、(GetProcAddressを呼び出す代わりに) procで指定された関数を Common Controls ライブラリに含めるかどうかを確認します。

要件

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Common Controls ライブラリが指定した API を実装するかどうかを決定します (これは unicode バージョンの AFX_COMCTL32_IF_EXISTSです)。

構文

AFX_COMCTL32_IF_EXISTS2( proc );

パラメーター

proc
関数名を含む null で終わる文字列へのポインター、または関数の序数値を指定します。 このパラメーターが序数値の場合は、下位ワードに含まれている必要があります。高次ワードはゼロでなければなりません。 このパラメーターは Unicode である必要があります。

解説

このマクロを使用して、(GetProcAddressを呼び出す代わりに) procで指定された関数を Common Controls ライブラリに含めるかどうかを確認します。 このマクロは、 AFX_COMCTL32_IF_EXISTSの Unicode バージョンです。

要件

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

CObjectからクラスを派生させるときに、オブジェクトのクラスに関する実行時情報にアクセスする機能を追加します。

DECLARE_DYNAMIC(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

DECLARE_DYNAMIC マクロをクラスのヘッダー (.h) モジュールに追加し、このクラスのオブジェクトへのアクセスを必要とするすべての.cpp モジュールにそのモジュールを含めます。

説明に従って DECLARE_DYNAMIC マクロと IMPLEMENT_DYNAMIC マクロを使用する場合は、 RUNTIME_CLASS マクロと CObject::IsKindOf 関数を使用して、実行時にオブジェクトのクラスを決定できます。

DECLARE_DYNAMICがクラス宣言に含まれている場合は、IMPLEMENT_DYNAMICクラスの実装に含まれている必要があります。

DECLARE_DYNAMIC マクロの詳細については、「クラス トピックのCObjectを参照してください。

IMPLEMENT_DYNAMIC の例を参照してください。

要件

ヘッダー: afx.h

DECLARE_DYNCREATE

CObject派生クラスのオブジェクトを実行時に動的に作成できるようにします。

DECLARE_DYNCREATE(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

フレームワークでは、この機能を使用して新しいオブジェクトを動的に作成します。 たとえば、新しいドキュメントを開いたときに作成された新しいビューなどです。 ドキュメント クラス、ビュー クラス、フレーム クラスは、フレームワークで動的に作成する必要があるため、動的な作成をサポートする必要があります。

クラスの .h モジュールに DECLARE_DYNCREATE マクロを追加し、そのモジュールを、このクラスのオブジェクトへのアクセスを必要とするすべての.cpp モジュールに含めます。

DECLARE_DYNCREATEがクラス宣言に含まれている場合は、IMPLEMENT_DYNCREATEクラスの実装に含まれている必要があります。

DECLARE_DYNCREATE マクロの詳細については、「クラス トピックのCObjectを参照してください。

Note

DECLARE_DYNCREATE マクロには、DECLARE_DYNAMICのすべての機能が含まれています。

IMPLEMENT_DYNCREATE の例を参照してください。

要件

ヘッダー: afx.h

DECLARE_OLECTLTYPE

コントロール クラスの GetUserTypeNameID および GetMiscStatus メンバー関数を宣言します。

構文

DECLARE_OLECTLTYPE( class_name )

パラメーター

class_name
コントロール クラスの名前。

解説

GetUserTypeNameIDGetMiscStatus は純粋な仮想関数であり、 COleControlで宣言されています。 これらの関数は純粋仮想であるため、コントロール クラスでオーバーライドする必要があります。 DECLARE_OLECTLTYPEに加えて、IMPLEMENT_OLECTLTYPE マクロをコントロール クラス宣言に追加する必要があります。

要件

ヘッダー: afxctl.h

DECLARE_PROPPAGEIDS

OLE コントロールがプロパティを表示するプロパティ ページの一覧を提供することを宣言します。

構文

DECLARE_PROPPAGEIDS( class_name )

パラメーター

class_name
プロパティ ページを所有するコントロール クラスの名前。

解説

クラス宣言の最後に DECLARE_PROPPAGEIDS マクロを使用します。 次に、クラスのメンバー関数を定義する .cpp ファイルで、 BEGIN_PROPPAGEIDS マクロ、コントロールの各プロパティ ページのマクロ エントリ、およびプロパティ ページ リストの末尾を宣言する END_PROPPAGEIDS マクロを使用します。

プロパティ ページの詳細については、「 ActiveX コントロール: プロパティ ページ」を参照してください。

要件

ヘッダー: afxctl.h

DECLARE_SERIAL

シリアル化できる CObject派生クラスに必要な C++ ヘッダー コードを生成します。

DECLARE_SERIAL(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

シリアル化とは、オブジェクトの内容をファイルとの間で書き込んだり読み取ったりするプロセスです。

.h モジュールで DECLARE_SERIAL マクロを使用し、このクラスのオブジェクトへのアクセスを必要とするすべての.cpp モジュールにそのモジュールを含めます。

DECLARE_SERIALがクラス宣言に含まれている場合は、IMPLEMENT_SERIALクラスの実装に含まれている必要があります。

DECLARE_SERIAL マクロには、DECLARE_DYNAMICDECLARE_DYNCREATEのすべての機能が含まれています。

AFX_API マクロを使用すると、DECLARE_SERIALマクロとIMPLEMENT_SERIAL マクロを使用するクラスのCArchive抽出演算子を自動的にエクスポートできます。 ( .h ファイルにある) クラス宣言を次のコードで角かっこで囲みます。

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

DECLARE_SERIAL マクロの詳細については、「クラス トピックのCObjectを参照してください。

class CAge : public CObject
{
public:
   void Serialize(CArchive& ar);
   DECLARE_SERIAL(CAge)

   // remainder of class declaration omitted

要件

ヘッダー: afx.h

IMPLEMENT_DYNAMIC

階層内のクラス名と位置への実行時アクセス権を持つ動的 CObject派生クラスに必要な C++ コードを生成します。

IMPLEMENT_DYNAMIC(class_name, base_class_name)

パラメーター

class_name
クラスの実際の名前。

base_class_name
基底クラスの名前。

解説

.cpp モジュールで IMPLEMENT_DYNAMIC マクロを使用し、結果のオブジェクト コードを 1 回だけリンクします。

詳細については、「クラス トピックCObjectを参照してください。

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

要件

ヘッダー: afx.h

IMPLEMENT_DYNCREATE

CObject派生クラスのオブジェクトを、DECLARE_DYNCREATE マクロで使用するときに実行時に動的に作成できるようにします。

IMPLEMENT_DYNCREATE(class_name, base_class_name)

パラメーター

class_name
クラスの実際の名前。

base_class_name
基底クラスの実際の名前。

解説

フレームワークでは、シリアル化中にディスクからオブジェクトを読み取る場合など、この機能を使用して新しいオブジェクトを動的に作成します。 クラス実装ファイルに IMPLEMENT_DYNCREATE マクロを追加します。 詳細については、「クラス トピックCObjectを参照してください。

DECLARE_DYNCREATEマクロとIMPLEMENT_DYNCREATEマクロを使用する場合は、RUNTIME_CLASS マクロと CObject::IsKindOf メンバー関数を使用して、実行時にオブジェクトのクラスを決定できます。

DECLARE_DYNCREATEがクラス宣言に含まれている場合は、IMPLEMENT_DYNCREATEクラスの実装に含まれている必要があります。

このマクロ定義では、クラスの既定のコンストラクターが呼び出されることに注意してください。 単純でないコンストラクターがクラスによって明示的に実装されている場合は、既定のコンストラクターも明示的に実装する必要があります。 既定のコンストラクターは、クラスの private またはメンバー セクション protected 追加して、クラス実装の外部から呼び出されないようにすることができます。

class CMyDynCreateObj : public CObject
{
   int m_Num;
public:
   DECLARE_DYNCREATE(CMyDynCreateObj)
   CMyDynCreateObj(int Num) { m_Num = Num; }
private:
   CMyDynCreateObj() { m_Num = 0; }  // provide default constructor only for 
                                     // dynamic creation 
};

 

IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)

要件

ヘッダー: afx.h

IMPLEMENT_OLECREATE_FLAGS

このマクロまたは IMPLEMENT_OLECREATE は、 DECLARE_OLECREATEを使用するすべてのクラスの実装ファイルに含まれている必要があります。

構文

IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
    l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

パラメーター

class_name
クラスの実際の名前。

external_name
他のアプリケーションに公開されるオブジェクト名 (引用符で囲む)。

nFlags
次のフラグの 1 つ以上が含まれています。

  • afxRegInsertable OLE オブジェクトの [オブジェクトの挿入] ダイアログ ボックスにコントロールを表示できるようにします。
  • afxRegApartmentThreading レジストリ内のスレッド モデルを ThreadingModel=Apartmentに設定します。
  • afxRegFreeThreading レジストリ内のスレッド モデルを ThreadingModel=Freeに設定します。

2 つのフラグ afxRegApartmentThreadingafxRegFreeThreading を組み合わせて ThreadingModel=Both を設定できます。 スレッド モデルの登録の詳細については、Windows SDK の InprocServer32 を参照してください。

lw1w2b1b2b3b4b5b6b7、クラスの CLSID の b8 コンポーネント。

解説

Note

IMPLEMENT_OLECREATE_FLAGSを使用する場合は、nFlags パラメーターを使用して、オブジェクトがサポートするスレッド モデルを指定できます。 シングルトレッド モデルのみをサポートする場合は、 IMPLEMENT_OLECREATEを使用します。

外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。

OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明のb8を通じて、lw1w2、およびb1で表される 1 つのlong、2 つの **WORD**、8 個の **BYTE**s で構成されます。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の OLE クラス ID が作成されます。

要件

ヘッダー: afxdisp.h

IMPLEMENT_OLECTLTYPE

コントロール クラスの GetUserTypeNameID および GetMiscStatus メンバー関数を実装します。

構文

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

パラメーター

class_name
コントロール クラスの名前。

idsUserTypeName
コントロールの外部名を含む文字列のリソース ID。

dwOleMisc
1 つ以上のフラグを含む列挙体。 この列挙体の詳細については、Windows SDK の OLEMISC を参照してください。

解説

IMPLEMENT_OLECTLTYPEに加えて、DECLARE_OLECTLTYPE マクロをコントロール クラス宣言に追加する必要があります。

GetUserTypeNameID メンバー関数は、コントロール クラスを識別するリソース文字列を返します。 GetMiscStatus は、コントロールの OLEMISC ビットを返します。 この列挙体は、コントロールのその他の特性を記述する設定のコレクションを指定します。 OLEMISC設定の詳細については、Windows SDK のOLEMISCを参照してください。

Note

ActiveX ControlWizard で使用される既定の設定は、 OLEMISC_ACTIVATEWHENVISIBLEOLEMISC_SETCLIENTSITEFIRSTOLEMISC_INSIDEOUTOLEMISC_CANTLINKINSIDE、および OLEMISC_RECOMPOSEONRESIZEです。

要件

ヘッダー: afxctl.h

IMPLEMENT_SERIAL

階層内のクラス名と位置への実行時アクセス権を持つ動的 CObject派生クラスに必要な C++ コードを生成します。

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

パラメーター

class_name
クラスの実際の名前。

base_class_name
基底クラスの名前。

wSchema
逆シリアル化プログラムが以前のバージョンのプログラムによって作成されたデータを識別して処理できるようにするために、アーカイブにエンコードされる UINT の "バージョン番号" です。 クラス スキーマ番号を -1 にすることはできません。

解説

.cpp モジュールで IMPLEMENT_SERIAL マクロを使用し、結果のオブジェクト コードを 1 回だけリンクします。

AFX_API マクロを使用すると、DECLARE_SERIALマクロとIMPLEMENT_SERIAL マクロを使用するクラスのCArchive抽出演算子を自動的にエクスポートできます。 ( .h ファイルにある) クラス宣言を次のコードで角かっこで囲みます。

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

詳細については、 CObject クラストピックを参照してください。

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

要件

ヘッダー: afx.h

RUNTIME_CLASS

C++ クラスの名前からランタイム クラス構造を取得します。

RUNTIME_CLASS(class_name)

パラメーター

class_name
クラスの実際の名前 (引用符で囲まれていません)。

解説

RUNTIME_CLASSは、class_name で指定されたクラスのCRuntimeClass構造体へのポインターを返します。 DECLARE_DYNAMICDECLARE_DYNCREATE、またはDECLARE_SERIALで宣言されたCObject派生クラスのみが、CRuntimeClass構造体へのポインターを返します。

詳細については、「クラス トピックCObjectを参照してください。

CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

要件

ヘッダー: afx.h

DECLARE_OLECREATE

OLE オートメーションを使用して CCmdTarget派生クラスのオブジェクトを作成できるようにします。

DECLARE_OLECREATE(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

このマクロを使用すると、他の OLE 対応アプリケーションがこの型のオブジェクトを作成できます。

クラスの .h モジュールに DECLARE_OLECREATE マクロを追加し、このクラスのオブジェクトへのアクセスを必要とするすべての.cpp モジュールにそのモジュールを含めます。

DECLARE_OLECREATEがクラス宣言に含まれている場合は、IMPLEMENT_OLECREATEクラスの実装に含まれている必要があります。 DECLARE_OLECREATEを使用するクラス宣言では、DECLARE_DYNCREATEまたはDECLARE_SERIALも使用する必要があります。

要件

ヘッダー: afxdisp.h

IMPLEMENT_OLECREATE

このマクロまたは IMPLEMENT_OLECREATE_FLAGS は、 DECLARE_OLECREATEを使用するすべてのクラスの実装ファイルに含まれている必要があります。

IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

パラメーター

class_name
クラスの実際の名前。

external_name
他のアプリケーションに公開されるオブジェクト名 (引用符で囲む)。

lw1w2b1b2b3b4b5b6b7、クラスの CLSID の b8 コンポーネント。

解説

Note

IMPLEMENT_OLECREATEを使用する場合、既定では、単一スレッド モデルのみがサポートされます。 IMPLEMENT_OLECREATE_FLAGSを使用する場合は、nFlags パラメーターを使用して、オブジェクトがサポートするスレッド モデルを指定できます。

外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。

OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明のb8を通じて、lw1w2、およびb1で表される 1 つのlong、2 つの **WORD**、8 個の **BYTE**s で構成されます。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の OLE クラス ID が作成されます。

要件

ヘッダー: afxdisp.h

関連項目

マクロとグローバル
MFC コモン コントロール ライブラリの分離
CLSID キー