다음을 통해 공유


CComObject, CComAggObject 및 CComPolyObject 구현

템플릿 클래스 CComObject, CComAggObjectCComPolyObject 는 상속 체인에서 항상 가장 파생된 클래스입니다. 의 모든 메서드를 처리하는 것은 그들의 책임입니다.IUnknownQueryInterfaceAddRefRelease 또한( CComAggObject CComPolyObject 집계된 개체에 사용되는 경우) 내부 알 수 없음에 필요한 특수 참조 계산 및 QueryInterface 의미 체계를 제공합니다.

사용 여부는 CComObjectCComAggObjectCComPolyObject 다음 매크로 중 하나(또는 없음)를 선언하는지 여부에 따라 달라집니다.

Macro 효과
DECLARE_NOT_AGGREGATABLE 항상 .를 사용합니다 CComObject.
DECLARE_AGGREGATABLE 개체가 집계된 경우와 CComObject 그렇지 않은 경우 사용합니다CComAggObject. CComCoClass 에는 이 매크로가 포함되어 있으므로 클래스에 선언된 DECLARE_*_AGGREGATABLE 매크로가 없는 경우 기본값이 됩니다.
DECLARE_ONLY_AGGREGATABLE 항상 .를 사용합니다 CComAggObject. 개체가 집계되지 않은 경우 오류를 반환합니다.
DECLARE_POLY_AGGREGATABLE ATL은 호출될 때 IClassFactory::CreateInstance CComPolyObject<CYourClass>인스턴스를 만듭니다. 만드는 동안 알 수 없는 외부의 값이 검사. NULL IUnknown 인 경우 집계되지 않은 개체에 대해 구현됩니다. 알 수 없는 외부가 NULL IUnknown 이 아니면 집계된 개체에 대해 구현됩니다.

사용 CComAggObject 의 장점은 CComObject 구현 IUnknown 이 생성되는 개체의 종류에 최적화되어 있다는 것입니다. 예를 들어 집계되지 않은 개체에는 참조 개수만 필요하지만 집계된 개체에는 알 수 없는 내부 참조 수와 알 수 없는 외부에 대한 포인터가 모두 필요합니다.

사용 CComPolyObject 의 장점은 모듈에서 CComAggObject 집계된 사례와 CComObject 집계되지 않은 사례를 모두 처리하지 않도록 방지한다는 것입니다. 단일 CComPolyObject 개체는 두 경우를 모두 처리합니다. 즉, vtable의 복사본 하나와 함수의 복사본 하나만 모듈에 존재합니다. vtable이 크면 모듈 크기를 크게 줄일 수 있습니다. 그러나 vtable이 작으면 집계된 개체나 집계되지 않은 개체에 대해 최적화되지 않으므로 모 CComPolyObject 듈 크기를 약간 더 크게 만들 수 있습니다 CComAggObject CComObject.

참고 항목

ATL COM 개체 기본 사항
집계 및 클래스 팩터리 매크로