ランタイム オブジェクト モデル サービス
クラス 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
コントロール クラスの名前。
解説
GetUserTypeNameID
と GetMiscStatus
は純粋な仮想関数であり、 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_DYNAMIC
とDECLARE_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 つのフラグ afxRegApartmentThreading
と afxRegFreeThreading
を組み合わせて ThreadingModel=Both を設定できます。 スレッド モデルの登録の詳細については、Windows SDK の InprocServer32
を参照してください。
l
、 w1
、 w2
、 b1
、 b2
、 b3
、 b4
、 b5
、 b6
、 b7
、クラスの CLSID の b8
コンポーネント。
解説
Note
IMPLEMENT_OLECREATE_FLAGS
を使用する場合は、nFlags
パラメーターを使用して、オブジェクトがサポートするスレッド モデルを指定できます。 シングルトレッド モデルのみをサポートする場合は、 IMPLEMENT_OLECREATE
を使用します。
外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。
OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明のb8
を通じて、l
、w1
、w2
、および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_ACTIVATEWHENVISIBLE
、 OLEMISC_SETCLIENTSITEFIRST
、 OLEMISC_INSIDEOUT
、 OLEMISC_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_DYNAMIC
、DECLARE_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
他のアプリケーションに公開されるオブジェクト名 (引用符で囲む)。
l
、 w1
、 w2
、 b1
、 b2
、 b3
、 b4
、 b5
、 b6
、 b7
、クラスの CLSID の b8
コンポーネント。
解説
Note
IMPLEMENT_OLECREATE
を使用する場合、既定では、単一スレッド モデルのみがサポートされます。 IMPLEMENT_OLECREATE_FLAGS
を使用する場合は、nFlags
パラメーターを使用して、オブジェクトがサポートするスレッド モデルを指定できます。
外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。
OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明のb8
を通じて、l
、w1
、w2
、およびb1
で表される 1 つのlong
、2 つの **WORD
**、8 個の **BYTE
**s で構成されます。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の OLE クラス ID が作成されます。
要件
ヘッダー: afxdisp.h