COM_INTERFACE_ENTRY 매크로
이러한 매크로는 COM 맵에 개체의 인터페이스를 입력하여 액세스할 QueryInterface
수 있도록 합니다. COM 맵의 항목 순서는 순서 인터페이스에서 일치하는 IID를 확인하는 동안 QueryInterface
입니다.
요구 사항
헤더: 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는 x를 IID_
에 추가하여 생성됩니다. 예를 들어 x이IPersistStorage
면 IID가 됩니다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는 x를 IID_
에 추가하여 생성됩니다. 예를 들어 x이IPersistStorage
면 IID가 됩니다IID_IPersistStorage
.