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

クラスとCRuntimeClass、ランタイム クラスCObject情報へのアクセス、シリアル化、動的オブジェクト作成など、いくつかのオブジェクト サービスをカプセル化します。 派生 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 ライブラリかどうかを確認します。 このマクロは Unicode バージョンの AFX_COMCTL32_IF_EXISTS.

必要条件

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

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

DECLARE_DYNAMIC(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

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

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

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

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

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

必要条件

ヘッダー:afx.h

DECLARE_DYNCREATE

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

DECLARE_DYNCREATE(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

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

クラスの DECLARE_DYNCREATE モジュールにマクロを .h 追加し、このクラスのオブジェクトにアクセスする必要があるすべての .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メンバー関数を定義するファイルで、マクロ、コントロールの各プロパティ ページのマクロ エントリ、およびEND_PROPPAGEIDSプロパティ ページ リストの末尾を宣言するマクロを使用BEGIN_PROPPAGEIDSします。

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

必要条件

ヘッダー:afxctl.h

DECLARE_SERIAL

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

DECLARE_SERIAL(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

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

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

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

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

このマクロをAFX_API使用すると、そのマクロとIMPLEMENT_SERIALマクロを使用するクラスのCArchive抽出演算子を自動的にDECLARE_SERIALエクスポートできます。 (ファイル内にある) クラス宣言を次の .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
基底クラスの名前。

解説

モジュールでマクロをIMPLEMENT_DYNAMIC.cpp使用し、結果のオブジェクト コードを 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

マクロとIMPLEMENT_DYNCREATEマクロをDECLARE_DYNCREATE使用する場合は、マクロとメンバー関数をRUNTIME_CLASSCObject::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 を設定できます。 スレッド モデルの登録の詳細については InprocServer32 、Windows SDK を参照してください。

lw1, w2, b1, b2, b3b4, b5, b6, , b7クラスb8の CLSID のコンポーネント。

解説

Note

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

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

OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明では、1 つlong、2 つの ****WORDs、および 8 つの **BYTE**s で構成されますb1lw2w1b8。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の 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_CANTLINKINSIDEOLEMISC_RECOMPOSEONRESIZE

必要条件

ヘッダー:afxctl.h

IMPLEMENT_SERIAL

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

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

パラメーター

class_name
クラスの実際の名前。

base_class_name
基底クラスの名前。

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

解説

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

このマクロをAFX_API使用すると、そのマクロとIMPLEMENT_SERIALマクロを使用するクラスのCArchive抽出演算子を自動的にDECLARE_SERIALエクスポートできます。 (ファイル内にある) クラス宣言を次の .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-derived クラスのみCObject、またはDECLARE_SERIAL構造体へのポインターをCRuntimeClass返します。

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

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

必要条件

ヘッダー:afx.h

DECLARE_OLECREATE

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

DECLARE_OLECREATE(class_name)

パラメーター

class_name
クラスの実際の名前。

解説

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

クラスの DECLARE_OLECREATE モジュールにマクロを .h 追加し、このクラスのオブジェクトにアクセスする必要があるすべての .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
他のアプリケーションに公開されるオブジェクト名 (引用符で囲む)。

lw1, w2, b1, b2, b3b4, b5, b6, , b7クラスb8の CLSID のコンポーネント。

解説

Note

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

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

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

必要条件

ヘッダー: afxdisp.h

関連項目

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