다음을 통해 공유


coclass

COM 인터페이스를 구현할 수 있는 COM 개체를 만듭니다.

구문

[coclass]

설명

coclass C++ 특성은 생성된 .idl 파일에 coclass 구문을 배치합니다.

coclass를 정의할 때 uuid, 버전, 스레딩, vi_progidprogid 특성을 지정할 수도 있습니다. 해당 중 하나를 지정하지 않으면 생성됩니다.

두 헤더 파일에 coclass 특성이 있는 클래스가 포함되어 있고 GUID를 지정하지 않으면 컴파일러는 두 클래스에 대해 동일한 GUID를 사용하므로 MIDL 오류가 발생합니다. 따라서 coclassuuid 사용할 때 특성을 사용해야 합니다.

ATL 프로젝트

이 특성이 ATL 프로젝트의 클래스 또는 구조 정의 앞에 오면 다음과 같습니다.

  • 개체에 대한 자동 등록을 지원하기 위해 코드 또는 데이터를 삽입합니다.

  • 코드 또는 데이터를 삽입하여 개체에 대한 COM 클래스 팩터리를 지원합니다.

  • 코드 또는 데이터를 삽입하여 개체를 COM 생성 가능 개체로 구현 IUnknown 하고 만듭니다.

특히 다음 기본 클래스가 대상 개체에 추가됩니다.

마지막으로 포함된 IDL을 사용하여 정의되지 않은 이중 인터페이스는 해당 IDispatchImpl 클래스로 대체됩니다. 이중 인터페이스가 포함된 IDL에 정의된 경우 기본 목록의 특정 인터페이스는 수정되지 않습니다.

또한 coclass 특성은 삽입된 코드를 통해 또는 기본 클래스CComCoClassGetObjectCLSID정적 메서드로 다음 함수를 사용할 수 있도록 합니다.

  • UpdateRegistry 는 대상 클래스의 클래스 팩터리를 등록합니다.

  • GetObjectCLSID등록과 관련된 대상 클래스의 CLSID를 가져오는 데 사용할 수도 있습니다.

  • GetObjectFriendlyName 기본적으로 "<대상 클래스 이름>Object" 형식의 문자열을 반환합니다. 이 함수가 이미 있는 경우 추가되지 않습니다. 대상 클래스에 이 함수를 추가하여 자동으로 생성된 이름보다 친숙한 이름을 반환합니다.

  • GetProgID등록과 관련된 progid 특성으로 지정된 문자열을 반환합니다.

  • GetVersionIndependentProgID는 기능과 동일GetProgID하지만 vi_progid 지정한 문자열을 반환합니다.

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