집계 및 클래스 팩터리 매크로
이러한 매크로는 집계를 제어하고 클래스 팩터리를 선언하는 방법을 제공합니다.
매크로 | 설명 |
---|---|
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
에서 파생되고 재정CreateInstance
의 CComClassFactory
되어야 합니다.
ATL은 클래스 팩터리를 선언하는 세 가지 다른 매크로를 제공합니다.
DECLARE_CLASSFACTORY2 라이선스를 통해 생성을 제어하는 CComClassFactory2를 사용합니다.
DECLARE_CLASSFACTORY_AUTO_THREAD 여러 아파트에 개체를 만드는 CComClassFactoryAutoThread를 사용합니다.
DECLARE_CLASSFACTORY_SINGLETON 단일 CComObjectGlobal 개체를 생성하는 CComClassFactorySingleton을 사용합니다.
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] 및 를 구현하는 클래스입니다VerifyLicenseKey
GetLicenseKey
IsLicenseValid
.
설명
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( );
설명
CComClassFactory2
는 IClassFactory의 확장인 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
정적 함수를 VerifyLicenseKey
GetLicenseKey
구현해야 하며 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
듈 크기를 약간 더 크게 만들 수 있습니다 CComAggObject
CComObject
.
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)