CComObject, CComAggObject 및 CComPolyObject 구현
템플릿 클래스 CComObject, CComAggObject 및 CComPolyObject 는 상속 체인에서 항상 가장 파생된 클래스입니다. 의 모든 메서드를 처리하는 것은 그들의 책임입니다.IUnknown
QueryInterface
AddRef
Release
또한( CComAggObject
CComPolyObject
집계된 개체에 사용되는 경우) 내부 알 수 없음에 필요한 특수 참조 계산 및 QueryInterface
의미 체계를 제공합니다.
사용 여부는 CComObject
CComAggObject
CComPolyObject
다음 매크로 중 하나(또는 없음)를 선언하는지 여부에 따라 달라집니다.
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
.