coclass
COM インターフェイスを実装する COM オブジェクトを作成します。
[coclass]
解説
コクラス C++ 属性は生成された .idl ファイルはコクラスの構造を配置します。
コクラスを定義する場合はuuidバージョンスレッドvi_progid と ProgID の属性を指定できます。これらのどちらでも指定しない場合が生成されます。
2 個のヘッダー ファイルにが含まれている場合 コクラス のクラスはGUID を属性付き ATL オブジェクトと属性を指定しない場合コンパイラはこれらのクラスに同じ GUID を使用してMIDL のエラーが発生します。したがって コクラス を使用するとuuid の属性を使用します。
ATL プロジェクト
この属性はATL プロジェクトのクラスまたは構造体の定義の前にある場合は:
コードまたはデータがオブジェクトの自動登録をサポートするために挿入します。
コードまたはデータがオブジェクトの COM クラス ファクトリをサポートするために挿入します。
コードまたはデータが IUnknown を実行しオブジェクトの COM オブジェクトの作成を行うに挿入します。
具体的には次の基本クラスはターゲット オブジェクトに追加されます :
CComCoClass のクラス はオブジェクトの既定のクラス ファクトリと集約モデルを提供します。
CComObjectRootEx のクラス に スレッド の属性で指定されたスレッド処理モデルのクラスに基づくテンプレートがあります。 スレッド の属性を指定しない場合既定のアパートメント スレッド モデルはです。
IProvideClassInfo2Impl は 作成 の属性がターゲット オブジェクトに対して指定する追加されます。
最後に埋め込み IDL を使用して定義されていないデュアル インターフェイスが IDispatchImpl の対応するクラスに置き換えられます。デュアル インターフェイスに埋め込み IDL で定義されている場合基本クラスのリストに特定のインターフェイスは変更されません。
コクラス の属性は次の関数を CComCoClass基本クラスの静的メソッドとして挿入されたコードまたは GetObjectCLSID で使用できるようにするには :
UpdateRegistry は前のクラス ファクトリを登録します。
または GetObjectCLSID の登録に関連する対象のクラスの CLSID を取得するために使用できます。
GetObjectFriendlyName の既定ではは 「形式 <target *クラス name>*Object 」の文字列。この関数が既に存在する場合は追加されません。自動的に生成する場合よりわかりやすい名前を返すため対象クラスにはこの関数を追加します。
GetProgID は登録に関連する ProgID の属性で指定された文字列を返します。
GetVersionIndependentProgID に GetProgID と同じ機能を持ちますがvi_progid で指定された文字列を返します。
COM マップに関連するターゲット クラスに次の変更が行われます。:
COM マップ先はクラスがから派生する COM インターフェイスのエントリ ポイント で指定されているすべてのエントリは集約 の属性で必要な属性と属性はすべてのインターフェイスのエントリが追加されます。
OBJECT_ENTRY_AUTO マクロは COM マップに挿入されます。このマクロは機能の点で OBJECT_ENTRY に似ていますが対象のクラスの COM マップの一部である必要はありません。
クラスの .idl ファイル内に生成されるクラスとコクラスの名前と同じ名前になります。たとえばMIDL で生成されるヘッダー ファイルを使用してクライアントのコクラス CMyClass のクラス ID にアクセスするには次の例を使用 CLSID_CMyClass 参照します。
使用例
次のコードは コクラス 属性の使用方法を示します :
// cpp_attr_ref_coclass1.cpp
// compile with: /LD
#include "unknwn.h"
[module(name="MyLib")];
[ object, uuid("00000000-0000-0000-0000-000000000001") ]
__interface I {
HRESULT func();
};
[coclass, progid("MyCoClass.coclass.1"), vi_progid("MyCoClass.coclass"),
appobject, uuid("9E66A294-4365-11D2-A997-00C04FA37DDB")]
class CMyClass : public I {};
次の例では コクラス の属性によって挿入されたコードに表示される関数の既定の実装をオーバーライドする方法を説明します。挿入されたコードの表示の詳細については /Fx を参照してください。このクラスで使用するインターフェイス挿入されるコードでの基本クラスが表示されます。 クラスが挿入されたコードが既定で含まれておりコクラスのベースとして明示的にそのクラスを指定する場合はさらに属性プロバイダーはコード内の指定した形式を使用します。
// cpp_attr_ref_coclass2.cpp
// compile with: /LD
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include <atlplus.h>
[module(name="MyLib")];
[object, uuid("00000000-0000-0000-0000-000000000000")]
__interface bb {};
[coclass, uuid("00000000-0000-0000-0000-000000000001")]
class CMyClass : public bb {
public:
// by adding the definition of UpdateRegistry to your code,
// the function will not be included in the injected code
static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {
// you can add to the default implementation
CRegistryVirtualMachine rvm;
HRESULT hr;
if (FAILED(hr = rvm.AddStandardReplacements()))
return hr;
rvm.AddReplacement(_T("FriendlyName"), GetObjectFriendlyName());
return rvm.VMUpdateRegistry(GetOpCodes(), GetOpcodeStringVals(),
GetOpcodeDWORDVals(), GetOpcodeBinaryVals(), bRegister);
}
};
必要条件
属性コンテキスト
対象 |
クラス struct |
複数回の適用 |
X |
必要な属性 |
なし |
無効な属性 |
なし |
属性コンテキストの詳細については、「属性コンテキスト」を参照してください。