다음을 통해 공유


집계 및 클래스 팩터리 매크로

이러한 매크로는 집계를 제어하고 클래스 팩터리를 선언하는 방법을 제공합니다.

매크로 설명
DECLARE_AGGREGATABLE 개체를 집계할 수 있음을 선언합니다(기본값).
DECLARE_CLASSFACTORY 클래스 팩터리를 ATL 기본 클래스 팩터 리인 CComClassFactory로 선언합니다.
DECLARE_CLASSFACTORY_EX 클래스 팩터리 개체를 클래스 팩터리로 선언합니다.
DECLARE_CLASSFACTORY2 CComClassFactory2를 클래스 팩터리로 선언합니다.
DECLARE_CLASSFACTORY_AUTO_THREAD CComClassFactoryAutoThread를 클래스 팩터리로 선언합니다.
DECLARE_CLASSFACTORY_SINGLETON CComClassFactorySingleton을 클래스 팩터리로 선언합니다.
DECLARE_GET_CONTROLLING_UNKNOWN 가상 GetControllingUnknown 함수를 선언합니다.
DECLARE_NOT_AGGREGATABLE 개체를 집계할 수 없음을 선언합니다.
DECLARE_ONLY_AGGREGATABLE 개체를 집계해야 한다고 선언합니다.
DECLARE_POLY_AGGREGATABLE 알 수 없는 외부의 값을 확인하고 개체 집계 가능 또는 집계할 수 없음을 적절하게 선언합니다.
DECLARE_PROTECT_FINAL_CONSTRUCT 내부 개체를 생성할 때 외부 개체가 삭제되는 것을 방지합니다.
DECLARE_VIEW_STATUS 컨테이너에 대한 VIEWSTATUS 플래그를 지정합니다.

요구 사항

헤더: atlcom.h

DECLARE_AGGREGATABLE

개체를 집계할 수 있도록 지정합니다.

DECLARE_AGGREGATABLE( x )

매개 변수

x
[in] 집계 가능으로 정의하는 클래스의 이름입니다.

설명

CComCoClass 에는 기본 집계 모델을 지정하는 이 매크로가 포함되어 있습니다. 이 기본값을 재정의하려면 클래스 정의에서 DECLARE_NOT_AGGREGATABLE 또는 DECLARE_ONLY_AGGREGATABLE 매크로를 지정합니다.

예시

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_CLASSFACTORY

CComClassFactory클래스 팩터리로 선언합니다.

DECLARE_CLASSFACTORY()

설명

CComCoClass 는 이 매크로를 사용하여 개체의 기본 클래스 팩터리를 선언합니다.

예시

class ATL_NO_VTABLE CMyClass :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY()

   // Remainder of class declaration omitted

CComClassFactory 클래스

이 클래스는 IClassFactory 인터페이스를 구현합니다.

class CComClassFactory : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

설명

CComClassFactory특정 CLSID의 개체를 만드는 방법과 새 개체를 더 빨리 만들 수 있도록 클래스 팩터리를 메모리에 잠그는 메서드를 포함하는 IClassFactory 인터페이스를 구현합니다. IClassFactory 는 시스템 레지스트리에 등록하고 CLSID를 할당하는 모든 클래스에 대해 구현되어야 합니다.

ATL 개체는 일반적으로 CComCoClass에서 파생하여 클래스 팩터리를 획득합니다. 이 클래스에는 CComClassFactory를 기본 클래스 팩터리로 선언하는 매크로 DECLARE_CLASSFACTORY 포함되어 있습니다. 이 기본값을 재정의하려면 클래스 정의에서 DECLARE_CLASSFACTORYXXX 매크로 중 하나를 지정합니다. 예를 들어 DECLARE_CLASSFACTORY_EX 매크로는 클래스 팩터리에 대해 지정된 클래스를 사용합니다.

class ATL_NO_VTABLE CMyCustomClass :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
   public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   DECLARE_CLASSFACTORY_EX(CMyClassFactory)

   // Remainder of class declaration omitted.

위의 클래스 정의는 개체의 기본 클래스 팩터리로 사용할 것을 지정 CMyClassFactory 합니다. CMyClassFactory에서 파생되고 재정CreateInstanceCComClassFactory 되어야 합니다.

ATL은 클래스 팩터리를 선언하는 세 가지 다른 매크로를 제공합니다.

DECLARE_CLASSFACTORY_EX

클래스 팩터리로 선언합니다 cf .

DECLARE_CLASSFACTORY_EX( cf )

매개 변수

cf
[in] 클래스 팩터리 개체를 구현하는 클래스의 이름입니다.

설명

cf 매개 변수는 CComClassFactory에서 파생되고 메서드를 재정의 CreateInstance 해야 합니다.

CComCoClass에는 기본 클래스 팩터리로 CComClassFactory 지정하는 DECLARE_CLASSFACTORY 매크로가 포함되어 있습니다. 그러나 개체의 클래스 정의에 DECLARE_CLASSFACTORY_EX 매크로를 포함하면 이 기본값을 재정의합니다.

예시

class ATL_NO_VTABLE CMyCustomClass :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyCustomClass, &CLSID_MyCustomClass>,
   public IDispatchImpl<IMyCustomClass, &IID_IMyCustomClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   DECLARE_CLASSFACTORY_EX(CMyClassFactory)

   // Remainder of class declaration omitted.

DECLARE_CLASSFACTORY2

CComClassFactory2를 클래스 팩터리로 선언합니다.

DECLARE_CLASSFACTORY2( lic )

매개 변수

lic
[in] 및 를 구현하는 클래스입니다VerifyLicenseKeyGetLicenseKeyIsLicenseValid.

설명

CComCoClass에는 CComClassFactory기본 클래스 팩터리로 지정하는 DECLARE_CLASSFACTORY 매크로가 포함되어 있습니다. 그러나 개체의 클래스 정의에 DECLARE_CLASSFACTORY2 매크로를 포함하면 이 기본값을 재정의합니다.

예시

class ATL_NO_VTABLE CMyClass2 :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass2, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY2(CMyLicense)

   // Remainder of class declaration omitted

CComClassFactory2 클래스

이 클래스는 IClassFactory2 인터페이스를 구현합니다.

template <class license>
class  CComClassFactory2 : public IClassFactory2,
    public CComObjectRootEx<CComGlobalsThreadModel>,
    public license

매개 변수

license
다음 정적 함수를 구현하는 클래스입니다.

  • static BOOL VerifyLicenseKey( BSTR bstr );

  • static BOOL GetLicenseKey( DWORD dwReserved, BSTR * pBstr );

  • static BOOL IsLicenseValid( );

설명

CComClassFactory2IClassFactory의 확장인 IClassFactory2 인터페이스를 구현합니다. IClassFactory2 는 라이선스를 통해 개체 만들기를 제어합니다. 라이선스가 부여된 컴퓨터에서 실행되는 클래스 팩터리는 런타임 라이선스 키를 제공할 수 있습니다. 이 라이선스 키를 사용하면 전체 컴퓨터 라이선스가 없는 경우 애플리케이션에서 개체를 인스턴스화할 수 있습니다.

ATL 개체는 일반적으로 CComCoClass에서 파생하여 클래스 팩터리를 획득합니다. 이 클래스에는 CComClassFactory기본 클래스 팩터리로 선언하는 매크로 DECLARE_CLASSFACTORY 포함됩니다. 사용 CComClassFactory2하려면 개체의 클래스 정의에서 DECLARE_CLASSFACTORY2 매크로를 지정합니다. 예시:

class ATL_NO_VTABLE CMyClass2 :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass2, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY2(CMyLicense)

   // Remainder of class declaration omitted

CMyLicense에 대한 템플릿 매개 변수는 CComClassFactory2정적 함수를 VerifyLicenseKeyGetLicenseKey구현해야 하며 IsLicenseValid. 다음은 간단한 라이선스 클래스의 예입니다.

class CMyLicense
{
protected:
   static BOOL VerifyLicenseKey(BSTR bstr)
   {
      USES_CONVERSION;
      return !lstrcmp(OLE2T(bstr), _T("My run-time license key"));
   }

   static BOOL GetLicenseKey(DWORD /*dwReserved*/, BSTR* pBstr) 
   {
      USES_CONVERSION;
      *pBstr = SysAllocString( T2OLE(_T("My run-time license key"))); 
      return TRUE;
   }

   static BOOL IsLicenseValid() {  return TRUE; }
};

CComClassFactory2는 라이선스와 라이선스 모두에서 CComClassFactory2Base 파생됩니다. CComClassFactory2Base에서 파생되고 CComObjectRootEx< CComGlobalsThreadModel>에서 IClassFactory2 파생됩니다.

DECLARE_CLASSFACTORY_AUTO_THREAD

CComClassFactoryAutoThread를 클래스 팩터리로 선언합니다.

DECLARE_CLASSFACTORY_AUTO_THREAD()

설명

CComCoClass에는 CComClassFactory기본 클래스 팩터리로 지정하는 DECLARE_CLASSFACTORY 매크로가 포함되어 있습니다. 그러나 개체의 클래스 정의에 DECLARE_CLASSFACTORY_AUTO_THREAD 매크로를 포함하면 이 기본값을 재정의합니다.

여러 아파트(out-of-proc 서버)에서 개체를 만들 때 클래스에 DECLARE_CLASSFACTORY_AUTO_THREAD 추가합니다.

예시

class ATL_NO_VTABLE CMyAutoClass :
   public CComObjectRootEx<CComMultiThreadModel>,
   public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
   public IMyAutoClass
{
public:
   DECLARE_CLASSFACTORY_AUTO_THREAD()

   // Remainder of class declaration omitted.

CComClassFactoryAutoThread 클래스

이 클래스는 IClassFactory 인터페이스를 구현하고 여러 아파트에서 개체를 만들 수 있습니다.

Important

이 클래스와 해당 멤버는 Windows 런타임에서 실행되는 애플리케이션에서 사용할 수 없습니다.

class CComClassFactoryAutoThread : public IClassFactory,
public CComObjectRootEx<CComGlobalsThreadModel>

설명

CComClassFactoryAutoThread는 CComClassFactory와 비슷하지만 여러 아파트에서 개체를 만들 수 있습니다. 이 지원을 활용하려면 CComAutoThreadModule에서 EXE 모듈을 파생합니다.

ATL 개체는 일반적으로 CComCoClass에서 파생하여 클래스 팩터리를 획득합니다. 이 클래스에는 CComClassFactory기본 클래스 팩터리로 선언하는 매크로 DECLARE_CLASSFACTORY 포함됩니다. 사용 CComClassFactoryAutoThread하려면 개체의 클래스 정의에서 DECLARE_CLASSFACTORY_AUTO_THREAD 매크로를 지정합니다. 예시:

class ATL_NO_VTABLE CMyAutoClass :
   public CComObjectRootEx<CComMultiThreadModel>,
   public CComCoClass<CMyAutoClass, &CLSID_MyAutoClass>,
   public IMyAutoClass
{
public:
   DECLARE_CLASSFACTORY_AUTO_THREAD()

   // Remainder of class declaration omitted.

DECLARE_CLASSFACTORY_SINGLETON

CComClassFactorySingleton을 클래스 팩터리로 선언합니다.

DECLARE_CLASSFACTORY_SINGLETON( obj )

매개 변수

obj
[in] 클래스 개체의 이름입니다.

설명

CComCoClass에는 CComClassFactory기본 클래스 팩터리로 지정하는 DECLARE_CLASSFACTORY 매크로가 포함되어 있습니다. 그러나 개체의 클래스 정의에 DECLARE_CLASSFACTORY_SINGLETON 매크로를 포함하면 이 기본값을 재정의합니다.

예시

class ATL_NO_VTABLE CMySingletonClass :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
   public IMySingletonClass
{
public:
   DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)

   // Remainder of class declaration omitted.

CComClassFactorySingleton 클래스

이 클래스는 CComClassFactory에서 파생되며 CComObjectGlobal을 사용하여 단일 개체를 생성합니다.

Important

이 클래스와 해당 멤버는 Windows 런타임에서 실행되는 애플리케이션에서 사용할 수 없습니다.

template<class T>
class CComClassFactorySingleton : public CComClassFactory

매개 변수

T
클래스입니다.

CComClassFactorySingleton는 CComClassFactory에서 파생되고 CComObjectGlobal을 사용하여 단일 개체를 생성합니다. 메서드에 대한 각 호출은 CreateInstance 인터페이스 포인터에 대해 이 개체를 쿼리하기만 하면 됩니다.

설명

ATL 개체는 일반적으로 CComCoClass에서 파생하여 클래스 팩터리를 획득합니다. 이 클래스에는 CComClassFactory를 기본 클래스 팩터리로 선언하는 매크로 DECLARE_CLASSFACTORY 포함되어 있습니다. 사용 CComClassFactorySingleton하려면 개체의 클래스 정의에 DECLARE_CLASSFACTORY_SINGLETON 매크로를 지정합니다. 예시:

class ATL_NO_VTABLE CMySingletonClass :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMySingletonClass, &CLSID_MySingletonClass>,
   public IMySingletonClass
{
public:
   DECLARE_CLASSFACTORY_SINGLETON(CMySingletonClass)

   // Remainder of class declaration omitted.

DECLARE_GET_CONTROLLING_UNKNOWN

가상 함수 GetControllingUnknown를 선언합니다.

DECLARE_GET_CONTROLLING_UNKNOWN()

설명

정의되지 않은 컴파일러 오류 메시지 GetControllingUnknown (예: )가 표시되면 이 매크로를 개체에 CComAggregateCreator추가합니다.

DECLARE_NOT_AGGREGATABLE

개체를 집계할 수 없되도록 지정합니다.

DECLARE_NOT_AGGREGATABLE( x )

매개 변수

x
[in] 집계할 수 없는 것으로 정의하는 클래스 개체의 이름입니다.

설명

CreateInstance DECLARE_NOT_AGGREGATABLE 개체에 집계하려고 하면 오류(CLASS_E_NOAGGREGATION)를 반환합니다.

기본적으로 CComCoClass 에는 개체를 집계할 수 있도록 지정하는 DECLARE_AGGREGATABLE 매크로가 포함되어 있습니다. 이 기본 동작을 재정의하려면 클래스 정의에 DECLARE_NOT_AGGREGATABLE 포함합니다.

예시

class ATL_NO_VTABLE CNoAggClass :
   public CComObjectRoot,
   public CComCoClass<CNoAggClass, &CLSID_NoAggClass>
{
public:
   CNoAggClass()
   {
   }

   DECLARE_NOT_AGGREGATABLE(CNoAggClass)
};

DECLARE_ONLY_AGGREGATABLE

개체를 집계해야 되도록 지정합니다.

DECLARE_ONLY_AGGREGATABLE( x )

매개 변수

x
[in] 집계 가능으로 정의할 클래스 개체의 이름입니다.

설명

DECLARE_ONLY_AGGREGATABLE 개체를 집계되지 않은 개체로 시도 CoCreate 하면 오류(E_FAIL)가 발생합니다.

기본적으로 CComCoClass 에는 개체를 집계할 수 있도록 지정하는 DECLARE_AGGREGATABLE 매크로가 포함되어 있습니다. 이 기본 동작을 재정의하려면 클래스 정의에 DECLARE_ONLY_AGGREGATABLE 포함합니다.

예시

class ATL_NO_VTABLE COnlyAggClass :
   public CComObjectRoot,
   public CComCoClass<COnlyAggClass, &CLSID_OnlyAggClass>
{
public:
   COnlyAggClass()
   {
   }

   DECLARE_ONLY_AGGREGATABLE(COnlyAggClass)
};

DECLARE_POLY_AGGREGATABLE

개체를 만들 때 CComPolyObject< x>의 인스턴스가 생성되도록 지정합니다.

DECLARE_POLY_AGGREGATABLE( x )

매개 변수

x
[in] 집계 가능하거나 집계할 수 없는 클래스 개체의 이름입니다.

설명

만드는 동안 알 수 없는 외부의 값이 검사. NULL IUnknown 인 경우 집계되지 않은 개체에 대해 구현됩니다. 알 수 없는 외부가 NULL IUnknown 이 아니면 집계된 개체에 대해 구현됩니다.

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

DECLARE_POLY_AGGREGATABLE 매크로는 ATL 컨트롤 마법사를 사용하여 모든 권한을 만드는 경우 개체에 자동으로 선언됩니다.

DECLARE_PROTECT_FINAL_CONSTRUCT

내부 집계된 개체가 참조 수를 증분한 다음 개수를 0으로 줄이면(FinalConstruct) 개체가 삭제되지 않도록 보호합니다.

DECLARE_PROTECT_FINAL_CONSTRUCT()

DECLARE_VIEW_STATUS

이 매크로를 ATL ActiveX 컨트롤의 컨트롤 클래스에 배치하여 컨테이너에 대한 VIEWSTATUS 플래그를 지정합니다.

DECLARE_VIEW_STATUS( statusFlags )

매개 변수

statusFlags
[in] VIEWSTATUS 플래그입니다. 플래그 목록은 VIEWSTATUS를 참조하세요.

예시

DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

참고 항목

매크로