coclass
COM インターフェイスを実装できる COM オブジェクトを作成します。
構文
[coclass]
解説
coclass C++ 属性は、生成された .idl ファイルに coclass コンストラクトを配置します。
coclass を定義するときに、uuid、version、threading、vi_progid、および progid の各属性も指定できます。 これらのいずれについても、指定されていない場合は生成されます。
2 つのヘッダー ファイルに coclass 属性を持つクラスが含まれていて、GUID が指定されていない場合、コンパイラは両方のクラスに同じ GUID を使用するため、MIDL エラーが発生します。 このため、coclass を使用するときには、uuid
属性を使用する必要があります。
ATL プロジェクト
この属性は、ATL プロジェクトのクラスまたは構造体の定義より前にある場合、次を実行します。
オブジェクトの自動登録をサポートするために、コードまたはデータを挿入します。
オブジェクトの COM クラス ファクトリをサポートするために、コードまたはデータを挿入します。
IUnknown
を実装するコードまたはデータを挿入し、オブジェクトを COM によって作成可能なオブジェクトにします。
具体的には、次の基本クラスがターゲット オブジェクトに追加されます。
CComCoClass クラス。オブジェクトの既定のクラス ファクトリと集計モデルを提供します。
CComObjectRootEx クラス。threading 属性によって指定されたスレッド モデル クラスに基づくテンプレートがあります。
threading
属性が指定されていない場合、既定のスレッド モデルはアパートメントです。IProvideClassInfo2Impl。noncreatable 属性がターゲット オブジェクトに対して指定されていない場合に追加されます。
最後に、埋め込み IDL を使用して定義されていないデュアル インターフェイスは、対応する IDispatchImpl クラスに置き換えられます。 デュアル インターフェイスが埋め込み IDL で定義されている場合、基本リスト内の特定のインターフェイスは変更されません。
coclass 属性は、挿入されたコード、または基底クラス CComCoClass
の静的メソッド (GetObjectCLSID
の場合) で、次の関数を使用できるようにもします。
UpdateRegistry
。ターゲット クラスのクラス ファクトリを登録します。GetObjectCLSID
。登録に関連します。ターゲット クラスの CLSID を取得するためにも使用できます。GetObjectFriendlyName
。既定では "<target class name>Object
" という形式の文字列を返します。 この関数は、既に存在する場合は追加されません。 自動的に生成されるよりもわかりやすい名前を返すには、この関数をターゲット クラスに追加してください。GetProgID
。登録に関連します。progid 属性で指定した文字列を返します。GetVersionIndependentProgID
。GetProgID
と機能は同じですが、vi_progid で指定した文字列を返します。
COM マップに関連する次の変更が、ターゲット クラスに対して加えられます。
COM マップに、ターゲット クラスの派生元のすべてのインターフェイスに対するエントリと、COM Interface Entry Points 属性によって指定されるか、aggregates 属性によって必要とされるすべてのエントリが追加されます。
COM マップに OBJECT_ENTRY_AUTO マクロが挿入されます。
クラスに対して生成された .idl ファイル内の coclass の名前は、クラスと同じ名前になります。 たとえば、次のサンプルで説明すると、coclass CMyClass
のクラス ID にアクセスするには、クライアントの MIDL 生成ヘッダーファイル内で CLSID_CMyClass
を使用します。
例
coclass 属性の使用方法を次のコードに示します。
// 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 {};
次の例は、coclass 属性によって挿入されたコードに表示される関数の既定の実装をオーバーライドする方法を示しています。 挿入されたコードを参照する方法の詳細については、「 /Fx 」を参照してください。 クラスに使用する基本のクラスまたはインターフェイスは、挿入されたコードに表示されます。 さらに、挿入されたコードにクラスが既定で含まれていて、そのクラスを coclass の基底として明示的に指定した場合、属性プロバイダーは、コードで指定された形式を使用します。
// 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);
}
};
要件
属性コンテキスト | Value |
---|---|
適用対象 | $ |
反復可能 | いいえ |
必要な属性 | なし |
無効な属性 | なし |
属性コンテキストの詳細については、「 属性コンテキスト」を参照してください。
関連項目
IDL 属性
COM 属性
クラス属性
Typedef、Enum、Union、および Struct 型の属性
appobject