coclass

COM インターフェイスを実装できる COM オブジェクトを作成します。

構文

[coclass]

解説

coclass C++ 属性は、生成された .idl ファイルに coclass コンストラクトを配置します。

coclass を定義するときに、uuidversionthreadingvi_progid、および progid の各属性も指定できます。 これらのいずれについても、指定されていない場合は生成されます。

2 つのヘッダー ファイルに coclass 属性を持つクラスが含まれていて、GUID が指定されていない場合、コンパイラは両方のクラスに同じ GUID を使用するため、MIDL エラーが発生します。 このため、coclass を使用するときには、uuid 属性を使用する必要があります。

ATL プロジェクト

この属性は、ATL プロジェクトのクラスまたは構造体の定義より前にある場合、次を実行します。

  • オブジェクトの自動登録をサポートするために、コードまたはデータを挿入します。

  • オブジェクトの COM クラス ファクトリをサポートするために、コードまたはデータを挿入します。

  • IUnknown を実装するコードまたはデータを挿入し、オブジェクトを COM によって作成可能なオブジェクトにします。

具体的には、次の基本クラスがターゲット オブジェクトに追加されます。

  • CComCoClass クラス。オブジェクトの既定のクラス ファクトリと集計モデルを提供します。

  • CComObjectRootEx クラスthreading 属性によって指定されたスレッド モデル クラスに基づくテンプレートがあります。 threading 属性が指定されていない場合、既定のスレッド モデルはアパートメントです。

  • IProvideClassInfo2Implnoncreatable 属性がターゲット オブジェクトに対して指定されていない場合に追加されます。

最後に、埋め込み IDL を使用して定義されていないデュアル インターフェイスは、対応する IDispatchImpl クラスに置き換えられます。 デュアル インターフェイスが埋め込み IDL で定義されている場合、基本リスト内の特定のインターフェイスは変更されません。

coclass 属性は、挿入されたコード、または基底クラス CComCoClass の静的メソッド (GetObjectCLSID の場合) で、次の関数を使用できるようにもします。

  • UpdateRegistry。ターゲット クラスのクラス ファクトリを登録します。

  • GetObjectCLSID。登録に関連します。ターゲット クラスの CLSID を取得するためにも使用できます。

  • GetObjectFriendlyName。既定では "<target class name>Object" という形式の文字列を返します。 この関数は、既に存在する場合は追加されません。 自動的に生成されるよりもわかりやすい名前を返すには、この関数をターゲット クラスに追加してください。

  • GetProgID。登録に関連します。progid 属性で指定した文字列を返します。

  • GetVersionIndependentProgIDGetProgID と機能は同じですが、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