ランタイム オブジェクト モデル サービス
クラスと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::IsKindOf
RUNTIME_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
コントロール クラスの名前。
解説
GetUserTypeNameID
で GetMiscStatus
宣言されている 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 クラスに必要な CObject
C++ ヘッダー コードを生成します。
DECLARE_SERIAL(class_name)
パラメーター
class_name
クラスの実際の名前。
解説
シリアル化とは、オブジェクトの内容をファイルとの間で書き込んだり読み取ったりするプロセスです。
モジュールでマクロをDECLARE_SERIAL
.h
使用し、このクラスのオブジェクトにアクセスする必要があるすべての.cpp
モジュールにそのモジュールを含めます。
クラス宣言に含まれている場合 DECLARE_SERIAL
は、 IMPLEMENT_SERIAL
クラス実装に含まれている必要があります。
マクロにはDECLARE_SERIAL
、すべての機能DECLARE_DYNAMIC
DECLARE_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_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 を設定できます。 スレッド モデルの登録の詳細については InprocServer32
、Windows SDK を参照してください。
l
、 w1
, w2
, b1
, b2
, b3
b4
, b5
, b6
, , b7
クラスb8
の CLSID のコンポーネント。
解説
Note
使用する場合は、パラメーターを使用 IMPLEMENT_OLECREATE_FLAGS
して、オブジェクトがサポートするスレッド モデルを nFlags
指定できます。 シングルトレッド モデルのみをサポートする場合は、次を使用します IMPLEMENT_OLECREATE
。
外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。
OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明では、1 つlong
、2 つの ****WORD
s、および 8 つの **BYTE
**s で構成されますb1
l
w2
w1
b8
。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の 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 にすることはできません。
解説
モジュールでマクロを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_DYNAMIC
DECLARE_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
他のアプリケーションに公開されるオブジェクト名 (引用符で囲む)。
l
、 w1
, w2
, b1
, b2
, b3
b4
, b5
, b6
, , b7
クラスb8
の CLSID のコンポーネント。
解説
Note
既定で使用 IMPLEMENT_OLECREATE
する場合は、単一スレッド モデルのみがサポートされます。 使用する場合は、パラメーターを使用 IMPLEMENT_OLECREATE_FLAGS
して、オブジェクトがサポートするスレッド モデルを nFlags
指定できます。
外部名は、他のアプリケーションに公開されている識別子です。 クライアント アプリケーションでは、外部名を使用して、オートメーション サーバーからこのクラスのオブジェクトを要求します。
OLE クラス ID は、オブジェクトの一意の 128 ビット識別子です。 構文の説明では、1 つlong
、2 つの ****WORD
s、および 8 つの **BYTE
**s で構成されますb1
l
w2
w1
b8
。 アプリケーション ウィザードとコード ウィザードでは、必要に応じて一意の OLE クラス ID が作成されます。
必要条件
ヘッダー: afxdisp.h
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示