次の方法で共有


com_interface_entry (C++)

適用先クラスの COM マップにインターフェイス エントリを追加します。

[ com_interface_entry( 
   com_interface_entry
 ) ]

パラメーター

解説

C++ 属性 com_interface_entry は、文字列のすべての内容をそのまま適用先オブジェクトの COM インターフェイス マップに挿入します。 属性が適用先オブジェクトに 1 回適用されると、エントリは既存のインターフェイス マップの先頭に挿入されます。 属性が同じ適用先オブジェクトに繰り返し適用されると、受け取った順にそのエントリがインターフェイス マップの先頭に挿入されます。

この属性を使用する場合は、同じ要素に対して coclassprogid、または vi_progid の各属性 (あるいは、これらの 1 つを表す別の属性) も適用する必要があります。 1 つの属性を使用すると、ほかの 2 つは自動的に適用されます。 たとえば、progid を適用すると、vi_progid および coclass も適用されます。

com_interface_entry を最初に使用する場合は、新規インターフェイスがインターフェイス マップの先頭に挿入されるので、この属性は以下の COM_INTERFACE_ENTRY 型のいずれかである必要があります。

  • COM_INTERFACE_ENTRY

  • COM_INTERFACE_ENTRY_IID

  • COM_INTERFACE_ENTRY2

  • COM_INTERFACE_ENTRY2_IID

com_interface_entry 属性をその後さらに使用すると、サポートされるすべての COM_INTERFACE_ENTRY 型を使用できます。

この制限が必要なのは、ATL がインターフェイス マップ内の最初のエントリを ID IUnknown として使用するため、エントリが有効なインターフェイスである必要があるからです。 たとえば、次のコード サンプルは、インターフェイス マップ内の最初のエントリが実際の COM インターフェイスを指定していないので無効です。

[ coclass, com_interface_entry =
    "COM_INTERFACE_ENTRY_NOINTERFACE(IDebugTest)"
]
   class CMyClass
   {
   };

使用例

CMyBaseClass の既存の COM インターフェイス マップに 2 つのエントリを追加するコードを次に示します。 最初のエントリは標準インターフェイスであり、2 番目のエントリは IDebugTest インターフェイスを隠ぺいします。

// cpp_attr_ref_com_interface_entry.cpp
// compile with: /LD
#define _ATL_ATTRIBUTES
#include "atlbase.h"
#include "atlcom.h"

[module (name ="ldld")];

[ object,
  uuid("7dbebed3-d636-4917-af62-c767a720a5b9")]
__interface IDebugTest{};

[ object,
  uuid("2875ceac-f94b-4087-8e13-d13dc167fcfc")]
__interface IMyClass{};

[ coclass,
  com_interface_entry ("COM_INTERFACE_ENTRY (IMyClass)"),
  com_interface_entry ("COM_INTERFACE_ENTRY_NOINTERFACE(IDebugTest)"),
  uuid("b85f8626-e76e-4775-b6a0-4826a9e94af2")
]

class CMyClass: public IMyClass, public IDebugTest
{
};

CMyBaseClass の結果の COM オブジェクト マップは次のとおりです。

    BEGIN_COM_MAP(CMyClass)
        COM_INTERFACE_ENTRY (IMyClass)
        COM_INTERFACE_ENTRY_NOINTERFACE(IDebugTest)
        COM_INTERFACE_ENTRY(IMyClass)
        COM_INTERFACE_ENTRY2(IDispatch, IMyClass)
        COM_INTERFACE_ENTRY(IDebugTest)
        COM_INTERFACE_ENTRY(IProvideClassInfo)
    END_COM_MAP()

必要条件

属性コンテキスト

対象

class、struct

複数回の適用

必要

必要な属性

以下の順で 1 つ以上の文字が続くコクラスprogid、または vi_progid

無効な属性

[なし]

属性コンテキストの詳細については、「属性コンテキスト」を参照してください。

参照

その他の技術情報

COM 属性

クラス属性

Typedef、Enum、Union、および Struct 型の属性

ATL サンプル