다음을 통해 공유


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을 가리키는 것으로 간주되며, 이 경우 항목이 무시됩니다. 일반적으로 CoCreate FinalConstruct.

예시

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.