coclass
COM 인터페이스를 구현할 수 있는 COM 개체를 만듭니다.
구문
[coclass]
설명
coclass C++ 특성은 생성된 .idl 파일에 coclass 구문을 배치합니다.
coclass를 정의할 때 uuid, 버전, 스레딩, vi_progid 및 progid 특성을 지정할 수도 있습니다. 해당 중 하나를 지정하지 않으면 생성됩니다.
두 헤더 파일에 coclass 특성이 있는 클래스가 포함되어 있고 GUID를 지정하지 않으면 컴파일러는 두 클래스에 대해 동일한 GUID를 사용하므로 MIDL 오류가 발생합니다. 따라서 coclass를 uuid
사용할 때 특성을 사용해야 합니다.
ATL 프로젝트
이 특성이 ATL 프로젝트의 클래스 또는 구조 정의 앞에 오면 다음과 같습니다.
개체에 대한 자동 등록을 지원하기 위해 코드 또는 데이터를 삽입합니다.
코드 또는 데이터를 삽입하여 개체에 대한 COM 클래스 팩터리를 지원합니다.
코드 또는 데이터를 삽입하여 개체를 COM 생성 가능 개체로 구현
IUnknown
하고 만듭니다.
특히 다음 기본 클래스가 대상 개체에 추가됩니다.
CComCoClass 클래스 는 개체에 대한 기본 클래스 팩터리 및 집계 모델을 제공합니다.
CComObjectRootEx 클래스에는 스레딩 특성으로 지정된 스레딩 모델 클래스를 기반으로 하는 템플릿이 있습니다.
threading
특성을 지정하지 않으면 기본 스레딩 모델은 아파트입니다.대상 개체에 대해 생성할 수 없는 특성이 지정되지 않은 경우 IProvideClassInfo2Impl이 추가됩니다.
마지막으로 포함된 IDL을 사용하여 정의되지 않은 이중 인터페이스는 해당 IDispatchImpl 클래스로 대체됩니다. 이중 인터페이스가 포함된 IDL에 정의된 경우 기본 목록의 특정 인터페이스는 수정되지 않습니다.
또한 coclass 특성은 삽입된 코드를 통해 또는 기본 클래스CComCoClass
의 GetObjectCLSID
정적 메서드로 다음 함수를 사용할 수 있도록 합니다.
UpdateRegistry
는 대상 클래스의 클래스 팩터리를 등록합니다.GetObjectCLSID
등록과 관련된 대상 클래스의 CLSID를 가져오는 데 사용할 수도 있습니다.GetObjectFriendlyName
기본적으로 "<대상 클래스 이름>Object
" 형식의 문자열을 반환합니다. 이 함수가 이미 있는 경우 추가되지 않습니다. 대상 클래스에 이 함수를 추가하여 자동으로 생성된 이름보다 친숙한 이름을 반환합니다.GetProgID
등록과 관련된 progid 특성으로 지정된 문자열을 반환합니다.GetVersionIndependentProgID
는 기능과 동일GetProgID
하지만 vi_progid 지정한 문자열을 반환합니다.
COM 맵과 관련된 다음 변경 내용은 대상 클래스에 적용됩니다.
COM 맵은 대상 클래스가 파생된 모든 인터페이스 및 COM 인터페이스 진입점 특성 또는 집계 특성에 필요한 항목으로 지정된 모든 항목에 대한 항목과 함께 추가됩니다.
OBJECT_ENTRY_AUTO 매크로가 COM 맵에 삽입됩니다.
클래스의 .idl 파일에서 생성된 coclass의 이름은 클래스와 동일한 이름을 갖습니다. 예를 들어 다음 샘플을 참조하여 coclass CMyClass
에 대한 클래스 ID에 액세스하려면 MIDL 생성 헤더 파일을 통해 클라이언트에서 사용합니다 CLSID_CMyClass
.
예시
다음 코드는 coclass 특성을 사용하는 방법을 보여줍니다.
// cpp_attr_ref_coclass1.cpp
// compile with: /LD
#include "unknwn.h"
[module(name="MyLib")];
[ object, uuid("00000000-0000-0000-0000-000000000001") ]
__interface I {
HRESULT func();
};
[coclass, progid("MyCoClass.coclass.1"), vi_progid("MyCoClass.coclass"),
appobject, uuid("9E66A294-4365-11D2-A997-00C04FA37DDB")]
class CMyClass : public I {};
다음 샘플에서는 coclass 특성에 의해 삽입된 코드에 표시되는 함수의 기본 구현을 재정의하는 방법을 보여 줍니다. 삽입된 코드 보기에 대한 자세한 정보는 /Fx 를 참조하세요. 클래스에 사용하는 모든 기본 클래스 또는 인터페이스가 삽입된 코드에 표시됩니다. 또한 클래스가 기본적으로 삽입된 코드에 포함되어 있고 해당 클래스를 coclass의 기반으로 명시적으로 지정하는 경우 특성 공급자는 코드에 지정된 양식을 사용합니다.
// cpp_attr_ref_coclass2.cpp
// compile with: /LD
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include <atlplus.h>
[module(name="MyLib")];
[object, uuid("00000000-0000-0000-0000-000000000000")]
__interface bb {};
[coclass, uuid("00000000-0000-0000-0000-000000000001")]
class CMyClass : public bb {
public:
// by adding the definition of UpdateRegistry to your code, // the function will not be included in the injected code
static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {
// you can add to the default implementation
CRegistryVirtualMachine rvm;
HRESULT hr;
if (FAILED(hr = rvm.AddStandardReplacements()))
return hr;
rvm.AddReplacement(_T("FriendlyName"), GetObjectFriendlyName());
return rvm.VMUpdateRegistry(GetOpCodes(), GetOpcodeStringVals(), GetOpcodeDWORDVals(), GetOpcodeBinaryVals(), bRegister);
}
};
요구 사항
특성 컨텍스트 | 값 |
---|---|
적용 대상: | class , struct |
반복 가능 | 아니요 |
필수 특성 | None |
잘못된 특성 | None |
특성 컨텍스트에 대한 자세한 내용은 특성 컨텍스트를 참조하세요.
참고 항목
IDL 특성
COM 특성
클래스 특성
Typedef, Enum, Union 및 Struct 특성
appobject