다음을 통해 공유


COM_INTERFACE_ENTRY 매크로

이러한 매크로는 COM 맵에 개체의 인터페이스를 입력하여 액세스할 QueryInterface수 있도록 합니다. COM 맵의 항목 순서는 순서 인터페이스가 일치하는 IID에 대해 검사 됩니다QueryInterface.

매크로 설명
COM_INTERFACE_ENTRY COM 인터페이스 맵에 인터페이스를 입력합니다.
COM_INTERFACE_ENTRY2 이 매크로를 사용하여 두 가지 상속 분기를 명확하게 구분할 수 있습니다.
COM_INTERFACE_ENTRY_IID 이 매크로를 사용하여 COM 맵에 인터페이스를 입력하고 해당 IID를 지정합니다.
COM_INTERFACE_ENTRY2_IID 다른 IID를 지정할 수 있는 경우를 제외하고 COM_INTERFACE_ENTRY2 동일합니다.
COM_INTERFACE_ENTRY_AGGREGATE iid식별된 인터페이스를 쿼리 COM_INTERFACE_ENTRY_AGGREGATE 하면 .으로 punk전달됩니다.
COM_INTERFACE_ENTRY_AGGREGATE_BLIND 모든 IID에 대한 쿼리로 인해 쿼리가 펑크에 전달된다는 점을 제외하고 COM_INTERFACE_ENTRY_AGGREGATE 동일합니다.
COM_INTERFACE_ENTRY_AUTOAGGREGATE COM_INTERFACE_ENTRY_AGGREGATE 펑크가 NULL인 경우를 제외하고 clsid에서 설명하는 집계를 자동으로 만듭니다.
COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND COM_INTERFACE_ENTRY_AUTOAGGREGATE 것과 동일하며, IID에 대한 쿼리는 쿼리를 펑크로 전달하고, 펑크가 NULL인 경우 clsid에 의해 설명된 집계를 자동으로 만듭니다.
COM_INTERFACE_ENTRY_BREAK 지정된 인터페이스를 쿼리할 때 프로그램이 DebugBreak를 호출하도록 합니다.
COM_INTERFACE_ENTRY_CACHED_TEAR_OFF 모든 인스턴스에 대한 인터페이스별 데이터를 저장합니다.
COM_INTERFACE_ENTRY_TEAR_OFF 분리된 인터페이스를 노출합니다.
COM_INTERFACE_ENTRY_CHAIN 처리가 COM 맵에서 이 항목에 도달하면 기본 클래스의 COM 맵을 처리합니다.
COM_INTERFACE_ENTRY_FUNC ATL의 논리에 연결하는 일반적인 메커니즘입니다 QueryInterface .
COM_INTERFACE_ENTRY_FUNC_BLIND iID를 쿼리하면 func 호출이 발생한다는 점을 제외하고 COM_INTERFACE_ENTRY_FUNC 동일합니다.
COM_INTERFACE_ENTRY_NOINTERFACE 지정된 인터페이스를 쿼리할 때 E_NOINTERFACE 반환하고 COM 맵 처리를 종료합니다.

요구 사항

헤더: atlcom.h

COM_INTERFACE_ENTRY

COM 인터페이스 맵에 인터페이스를 입력합니다.

구문

COM_INTERFACE_ENTRY( x )

매개 변수

x
[in] 클래스 개체가 직접 파생되는 인터페이스의 이름입니다.

설명

일반적으로 가장 자주 사용하는 항목 유형입니다.

예시

BEGIN_COM_MAP(CThisExample)
   COM_INTERFACE_ENTRY(IThisExample)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

요구 사항

헤더: atlcom.h

COM_INTERFACE_ENTRY2

이 매크로를 사용하여 두 가지 상속 분기를 명확하게 구분할 수 있습니다.

COM_INTERFACE_ENTRY2(x, x2)

매개 변수

x
[in] 개체에서 노출하려는 인터페이스의 이름입니다.

x2
[in] x가 노출되는 상속 분기의 이름입니다.

설명

예를 들어 두 개의 이중 인터페이스에서 클래스 개체를 파생하는 경우 인터페이스 중 하나에서 가져올 수 있으므로 IDispatch COM_INTERFACE_ENTRY2 사용하여 노출 IDispatch 합니다.

예시

class ATL_NO_VTABLE CEntry2Example :
   public CEntry2ExampleBase, // CEntry2ExampleBase derives from IDispatch
   public IDispatchImpl<IEntry2Example, &IID_IEntry2Example, &LIBID_NVC_ATL_WindowingLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public CComCoClass<CEntry2Example, &CLSID_Entry2Example>
{
public:
   CEntry2Example()
   {
   }

BEGIN_COM_MAP(CEntry2Example)
   COM_INTERFACE_ENTRY(IEntry2Example)
   COM_INTERFACE_ENTRY2(IDispatch, IEntry2Example)
END_COM_MAP()
};

COM_INTERFACE_ENTRY_IID

이 매크로를 사용하여 COM 맵에 인터페이스를 입력하고 해당 IID를 지정합니다.

COM_INTERFACE_ENTRY_IID(iid, x)

매개 변수

iid
[in] 노출된 인터페이스의 GUID입니다.

x
[in] vtable이 iid로 식별된 인터페이스로 노출되는 클래스의 이름입니다.

예시

BEGIN_COM_MAP(CExample)
   COM_INTERFACE_ENTRY(IExample)
   COM_INTERFACE_ENTRY_IID(IID_IDispatch, CExampleDispatch)
   COM_INTERFACE_ENTRY(IExampleBase)
   COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()

COM_INTERFACE_ENTRY2_IID

다른 IID를 지정할 수 있는 경우를 제외하고 COM_INTERFACE_ENTRY2 동일합니다.

COM_INTERFACE_ENTRY2_IID(iid, x, x2)

매개 변수

iid
[in] 인터페이스에 대해 지정하는 GUID입니다.

x
[in] 클래스 개체가 직접 파생되는 인터페이스의 이름입니다.

x2
[in] 클래스 개체가 직접 파생되는 두 번째 인터페이스의 이름입니다.

COM_INTERFACE_ENTRY_AGGREGATE

iid식별된 인터페이스를 쿼리하면 COM_INTERFACE_ENTRY_AGGREGATE 펑크전달됩니다.

COM_INTERFACE_ENTRY_AGGREGATE(iid, punk)

매개 변수

iid
[in] 쿼리된 인터페이스의 GUID입니다.

punk
[in] 포인터의 이름입니다 IUnknown .

설명

펑크 매개 변수는 집계의 내부 알 수 없음 또는 NULL을 가리키는 것으로 간주되며, 이 경우 항목이 무시됩니다. 일반적으로 CoCreateFinalConstruct.

예시

BEGIN_COM_MAP(COuter1)
   COM_INTERFACE_ENTRY_AGGREGATE(__uuidof(IAgg), m_punkAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AGGREGATE_BLIND

모든 IID에 대한 쿼리로 인해 쿼리가 펑크에 전달된다는 점을 제외하고 COM_INTERFACE_ENTRY_AGGREGATE 동일합니다.

COM_INTERFACE_ENTRY_AGGREGATE_BLIND(punk)

매개 변수

punk
[in] 포인터의 이름입니다 IUnknown .

설명

인터페이스 쿼리가 실패하면 COM 맵의 처리가 계속됩니다.

예시

BEGIN_COM_MAP(COuter2)
   COM_INTERFACE_ENTRY_AGGREGATE_BLIND(m_punkAggBlind)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE

COM_INTERFACE_ENTRY_AGGREGATE 펑크가 NULL인 경우를 제외하고 clsid에서 설명하는 집계를 자동으로 만듭니다.

COM_INTERFACE_ENTRY_AUTOAGGREGATE(iid, punk, clsid)

매개 변수

iid
[in] 쿼리된 인터페이스의 GUID입니다.

punk
[in] 포인터의 이름입니다 IUnknown . COM 맵을 포함하는 클래스의 멤버여야 합니다.

clsid
[in] 펑크가 NULL인 경우 생성될 집계의 식별자입니다.

설명

예시

BEGIN_COM_MAP(COuter3)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE(__uuidof(IAutoAgg), m_punkAutoAgg, CLSID_CAutoAgg)
END_COM_MAP()

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND

COM_INTERFACE_ENTRY_AUTOAGGREGATE 것과 동일하며, IID에 대한 쿼리는 쿼리를 펑크로 전달하고, 펑크가 NULL인 경우 clsid에 의해 설명된 집계를 자동으로 만듭니다.

COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(punk, clsid)

매개 변수

punk
[in] 포인터의 이름입니다 IUnknown . COM 맵을 포함하는 클래스의 멤버여야 합니다.

clsid
[in] 펑크가 NULL인 경우 생성될 집계의 식별자입니다.

설명

인터페이스 쿼리가 실패하면 COM 맵의 처리가 계속됩니다.

예시

BEGIN_COM_MAP(COuter4)
   COM_INTERFACE_ENTRY_AUTOAGGREGATE_BLIND(m_punkAutoAggB, CLSID_CAutoAggB)
END_COM_MAP()

COM_INTERFACE_ENTRY_BREAK

지정된 인터페이스를 쿼리할 때 프로그램이 DebugBreak를 호출하도록 합니다.

COM_INTERFACE_ENTRY_BREAK(x)

매개 변수

x
[in] 인터페이스 식별자를 생성하는 데 사용되는 텍스트입니다.

설명

인터페이스 IID는 xIID_에 추가하여 생성됩니다. 예를 들어 xIPersistStorageIID가 됩니다IID_IPersistStorage.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF

모든 인스턴스에 대한 인터페이스별 데이터를 저장합니다.

COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(iid, x, punk)

매개 변수

iid
[in] 분리 인터페이스의 GUID입니다.

x
[in] 인터페이스를 구현하는 클래스의 이름입니다.

punk
[in] 포인터의 이름입니다 IUnknown . COM 맵을 포함하는 클래스의 멤버여야 합니다. 클래스 개체의 생성자에서 NULL로 초기화해야 합니다.

설명

인터페이스를 사용하지 않으면 개체의 전체 인스턴스 크기가 낮아집니다.

예시

BEGIN_COM_MAP(COuter)
   COM_INTERFACE_ENTRY(IOuter)
   COM_INTERFACE_ENTRY_CACHED_TEAR_OFF(IID_ITearOff, CTearOff, punkTearOff)
END_COM_MAP()

COM_INTERFACE_ENTRY_TEAR_OFF

분리된 인터페이스를 노출합니다.

COM_INTERFACE_ENTRY_TEAR_OFF(iid, x)

매개 변수

iid
[in] 분리 인터페이스의 GUID입니다.

x
[in] 인터페이스를 구현하는 클래스의 이름입니다.

설명

분리 인터페이스는 나타내는 인터페이스가 쿼리될 때마다 인스턴스화되는 별도의 개체로 구현됩니다. 일반적으로 인터페이스가 거의 사용되지 않는 경우 인터페이스를 분리로 빌드합니다. 이는 기본 개체의 모든 인스턴스에 vtable 포인터를 저장하기 때문에 발생합니다. 해제는 참조 수가 0이 되면 삭제됩니다. 분리를 구현하는 클래스는 파생되어야 CComTearOffObjectBase 하며 자체 COM 맵이 있어야 합니다.

예시

BEGIN_COM_MAP(CBeeper)
   COM_INTERFACE_ENTRY(IBeeper)
   COM_INTERFACE_ENTRY(IDispatch)
   COM_INTERFACE_ENTRY_TEAR_OFF(IID_ISupportErrorInfo, CBeeper2)
END_COM_MAP()

COM_INTERFACE_ENTRY_CHAIN

처리가 COM 맵에서 이 항목에 도달하면 기본 클래스의 COM 맵을 처리합니다.

COM_INTERFACE_ENTRY_CHAIN(classname)

매개 변수

classname
[in] 현재 개체의 기본 클래스입니다.

설명

예를 들어 다음 코드에서 다음을 수행합니다.

BEGIN_COM_MAP(COuterObject)
   COM_INTERFACE_ENTRY2(IDispatch, IOuterObject)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM 맵의 첫 번째 항목은 COM 맵을 포함하는 개체의 인터페이스여야 합니다. 따라서 COM_INTERFACE_ENTRY_CHAIN COM 맵 항목을 시작할 수 없으므로 개체의 COM 맵에 COM_INTERFACE_ENTRY_CHAIN(COtherObject)가 표시되는 지점에서 다른 개체의 COM 맵을 검색합니다. 먼저 다른 개체의 COM 맵을 검색하려면 COM 맵에 대한 IUnknown 인터페이스 항목을 추가한 다음 다른 개체의 COM 맵을 연결합니다. 예시:

BEGIN_COM_MAP(CThisObject)
   COM_INTERFACE_ENTRY(IUnknown)
   COM_INTERFACE_ENTRY_CHAIN(CBase)
END_COM_MAP()

COM_INTERFACE_ENTRY_FUNC

ATL의 논리에 연결하는 일반적인 메커니즘입니다 QueryInterface .

COM_INTERFACE_ENTRY_FUNC(iid, dw, func)

매개 변수

iid
[in] 노출된 인터페이스의 GUID입니다.

dw
[in] func에 전달된 매개 변수입니다.

func
[in] iid를 반환할 함수 포인터입니다.

설명

iid가 쿼리된 인터페이스의 IID와 일치하면 func지정된 함수가 호출됩니다. 함수에 대한 선언은 다음이어야 합니다.

HRESULT WINAPI func(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw);

함수가 호출 pv 되면 클래스 개체를 가리킵니다. riid 매개 변수는 쿼리되는 인터페이스를 참조하고, ppv 함수가 인터페이스에 대한 포인터를 저장해야 하는 위치에 대한 포인터이며, dw는 항목에 지정한 매개 변수입니다. 함수는 * ppv 를 NULL로 설정하고 인터페이스를 반환하지 않기로 선택한 경우 E_NOINTERFACE 또는 S_FALSE 반환해야 합니다. E_NOINTERFACE COM 맵 처리가 종료됩니다. 인터페이스 포인터가 반환되지 않았더라도 S_FALSE COM 맵 처리가 계속됩니다. 함수가 인터페이스 포인터를 반환하는 경우 S_OK 반환해야 합니다.

COM_INTERFACE_ENTRY_FUNC_BLIND

iID를 쿼리하면 func 호출이 발생한다는 점을 제외하고 COM_INTERFACE_ENTRY_FUNC 동일합니다.

COM_INTERFACE_ENTRY_FUNC_BLIND(dw, func)

매개 변수

dw
[in] func에 전달된 매개 변수입니다.

func
[in] COM 맵에서 이 항목이 처리될 때 호출되는 함수입니다.

설명

오류가 발생하면 COM 맵에서 처리를 계속합니다. 함수가 인터페이스 포인터를 반환하는 경우 S_OK 반환해야 합니다.

COM_INTERFACE_ENTRY_NOINTERFACE

지정된 인터페이스를 쿼리할 때 E_NOINTERFACE 반환하고 COM 맵 처리를 종료합니다.

COM_INTERFACE_ENTRY_NOINTERFACE(x)

매개 변수

x
[in] 인터페이스 식별자를 생성하는 데 사용되는 텍스트입니다.

설명

이 매크로를 사용하여 인터페이스가 특정 경우에 사용되지 않도록 할 수 있습니다. 예를 들어 인터페이스에 대한 쿼리가 집계의 내부 알 수 없는 쿼리로 전달되지 않도록 COM_INTERFACE_ENTRY_AGGREGATE_BLIND 바로 전에 COM 맵에 이 매크로를 삽입할 수 있습니다.

인터페이스 IID는 xIID_에 추가하여 생성됩니다. 예를 들어 xIPersistStorageIID가 됩니다IID_IPersistStorage.