다음을 통해 공유


런타임 개체 모델 서비스

클래스는 CObject 런타임 클래스 정보, serialization 및 CRuntimeClass 동적 개체 만들기에 대한 액세스를 포함하여 여러 개체 서비스를 캡슐화합니다. 파생된 CObject 모든 클래스는 이 기능을 상속합니다.

런타임 클래스 정보에 액세스하면 런타임에 개체의 클래스에 대한 정보를 확인할 수 있습니다. 런타임에 개체의 클래스를 확인하는 기능은 함수 인수의 추가 형식 검사 지정이 필요하고 개체 클래스에 따라 특수 용도의 코드를 작성해야 하는 경우에 유용합니다. 런타임 클래스 정보는 C++ 언어에서 직접 지원되지 않습니다.

Serialization은 파일에서 개체의 내용을 쓰거나 읽는 프로세스입니다. serialization을 사용하여 애플리케이션이 종료된 후에도 개체의 콘텐츠를 저장할 수 있습니다. 그런 다음 애플리케이션을 다시 시작할 때 파일에서 개체를 읽을 수 있습니다. 이러한 데이터 개체는 "영구적"이라고 합니다.

동적 개체를 만들면 런타임에 지정된 클래스의 개체를 만들 수 있습니다. 예를 들어 문서, 뷰 및 프레임 개체는 프레임워크에서 동적으로 만들어야 하므로 동적 생성을 지원해야 합니다.

다음 표에서는 런타임 클래스 정보, serialization 및 동적 생성을 지원하는 MFC 매크로를 나열합니다.

이러한 런타임 개체 서비스 및 serialization에 대한 자세한 내용은 클래스: 런타임 클래스 정보에 액세스하는 문서를 CObject 참조하세요.

런타임 개체 모델 서비스 매크로

이름 설명
DECLARE_DYNAMIC 런타임 클래스 정보에 액세스할 수 있도록 합니다(클래스 선언에 사용해야 합니다).
DECLARE_DYNCREATE 런타임 클래스 정보에 대한 동적 생성 및 액세스를 사용하도록 설정합니다(클래스 선언에서 사용해야 합니다).
DECLARE_SERIAL 런타임 클래스 정보에 대한 직렬화 및 액세스를 사용하도록 설정합니다(클래스 선언에서 사용해야 합니다).
IMPLEMENT_DYNAMIC 런타임 클래스 정보에 대한 액세스를 사용하도록 설정합니다(클래스 구현에서 사용해야 합니다).
IMPLEMENT_DYNCREATE 동적 생성 및 런타임 정보에 대한 액세스를 사용하도록 설정합니다(클래스 구현에서 사용해야 합니다).
IMPLEMENT_SERIAL 런타임 클래스 정보에 대한 직렬화 및 액세스를 허용합니다(클래스 구현에서 사용해야 합니다).
RUNTIME_CLASS 명명된 CRuntimeClass 클래스에 해당하는 구조를 반환합니다.

OLE에는 런타임에 개체를 동적으로 생성해야 하는 경우가 많습니다. 예를 들어 OLE 서버 애플리케이션은 클라이언트의 요청에 대한 응답으로 동적으로 OLE 항목을 만들 수 있어야 합니다. 마찬가지로 자동화 서버는 자동화 클라이언트의 요청에 대한 응답으로 항목을 만들 수 있어야 합니다.

Microsoft Foundation 클래스 라이브러리는 OLE와 관련된 두 개의 매크로를 제공합니다.

OLE 개체의 동적 만들기

이름 설명
AFX_COMCTL32_IF_EXISTS Common Controls 라이브러리가 지정된 API를 구현하는지 여부를 결정합니다.
AFX_COMCTL32_IF_EXISTS2 Common Controls 라이브러리가 지정된 API를 구현하는지 여부를 결정합니다.
DECLARE_OLECREATE OLE 자동화를 통해 개체를 만들 수 있습니다.
DECLARE_OLECTLTYPE 컨트롤 클래스의 GetUserTypeNameID 멤버 함수와 GetMiscStatus 멤버 함수를 선언합니다.
DECLARE_PROPPAGEIDS OLE 컨트롤이 속성을 표시하는 속성 페이지 목록을 제공한다고 선언합니다.
IMPLEMENT_OLECREATE OLE 시스템에서 개체를 만들 수 있습니다.
IMPLEMENT_OLECTLTYPE 컨트롤 클래스의 GetUserTypeNameID 멤버 함수와 GetMiscStatus 멤버 함수를 구현합니다.
IMPLEMENT_OLECREATE_FLAGS 이 매크로 또는 IMPLEMENT_OLECREATE 사용 DECLARE_OLECREATE하는 클래스에 대 한 구현 파일에 표시 해야 합니다.

AFX_COMCTL32_IF_EXISTS

Common Controls 라이브러리가 지정된 API를 구현하는지 여부를 결정합니다.

구문

AFX_COMCTL32_IF_EXISTS(  proc );

매개 변수

proc
함수 이름을 포함하는 null로 끝나는 문자열에 대한 포인터이거나 함수의 서수 값을 지정합니다. 이 매개 변수가 서수 값이면 낮은 순서의 단어여야 합니다. 상위 단어는 0이어야 합니다. 이 매개 변수는 유니코드에 있어야 합니다.

설명

이 매크로를 사용하여 함수가 지정 proc 한 함수를 호출 GetProcAddress하는 대신 Common Controls 라이브러리인지 여부를 확인합니다.

요구 사항

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Common Controls 라이브러리가 지정된 API(유니코드 버전 AFX_COMCTL32_IF_EXISTS)를 구현하는지 여부를 결정합니다.

구문

AFX_COMCTL32_IF_EXISTS2( proc );

매개 변수

proc
함수 이름을 포함하는 null로 끝나는 문자열에 대한 포인터이거나 함수의 서수 값을 지정합니다. 이 매개 변수가 서수 값이면 낮은 순서의 단어여야 합니다. 상위 단어는 0이어야 합니다. 이 매개 변수는 유니코드에 있어야 합니다.

설명

이 매크로를 사용하여 함수가 지정 proc 한 함수를 호출 GetProcAddress하는 대신 Common Controls 라이브러리인지 여부를 확인합니다. 이 매크로는 유니코드 버전의 AFX_COMCTL32_IF_EXISTS.

요구 사항

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

에서 클래스를 파생할 때 개체의 클래스에 대한 런타임 정보에 액세스하는 CObject기능을 추가합니다.

DECLARE_DYNAMIC(class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

설명

클래스의 DECLARE_DYNAMIC 헤더(.h) 모듈에 매크로를 추가한 다음 이 클래스의 개체에 액세스해야 하는 모든 .cpp 모듈에 해당 모듈을 포함합니다.

설명된 DECLARE_DYNAMIC 대로 매크로와 IMPLEMENT_DYNAMIC 매크로를 사용하는 경우 매크로와 함수를 CObject::IsKindOf 사용하여 RUNTIME_CLASS 런타임에 개체의 클래스를 확인할 수 있습니다.

클래스 선언 IMPLEMENT_DYNAMIC 에 포함된 경우 DECLARE_DYNAMIC 클래스 구현에 포함되어야 합니다.

매크로에 대한 DECLARE_DYNAMIC 자세한 내용은 클래스 토픽을 참조 CObject 하세요.

예시

에 대한 예제를 IMPLEMENT_DYNAMIC참조하세요.

요구 사항

헤더afx.h:

DECLARE_DYNCREATE

런타임에 파생 클래스의 CObject개체를 동적으로 만들 수 있습니다.

DECLARE_DYNCREATE(class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

설명

프레임워크는 이 기능을 사용하여 새 개체를 동적으로 만듭니다. 예를 들어 새 문서를 열 때 만든 새 보기입니다. 문서, 뷰 및 프레임 클래스는 프레임워크에서 동적으로 만들어야 하므로 동적 생성을 지원해야 합니다.

클래스의 DECLARE_DYNCREATE 모듈에 .h 매크로를 추가한 다음 이 클래스의 개체에 액세스해야 하는 모든 .cpp 모듈에 해당 모듈을 포함합니다.

클래스 선언 IMPLEMENT_DYNCREATE 에 포함된 경우 DECLARE_DYNCREATE 클래스 구현에 포함되어야 합니다.

매크로에 대한 DECLARE_DYNCREATE 자세한 내용은 클래스 토픽을 참조 CObject 하세요.

참고 항목

매크로에는 DECLARE_DYNCREATE .의 DECLARE_DYNAMIC모든 기능이 포함됩니다.

예시

에 대한 예제를 IMPLEMENT_DYNCREATE참조하세요.

요구 사항

헤더afx.h:

DECLARE_OLECTLTYPE

컨트롤 클래스의 GetUserTypeNameID 멤버 함수와 GetMiscStatus 멤버 함수를 선언합니다.

구문

DECLARE_OLECTLTYPE( class_name )

매개 변수

class_name
컨트롤 클래스의 이름입니다.

설명

GetUserTypeNameIDGetMiscStatus 선언된 순수 가상 함수입니다 COleControl. 이러한 함수는 순수 가상이므로 컨트롤 클래스에서 재정의해야 합니다. 또한 DECLARE_OLECTLTYPE컨트롤 클래스 선언에 매크로를 IMPLEMENT_OLECTLTYPE 추가해야 합니다.

요구 사항

헤더afxctl.h:

DECLARE_PROPPAGEIDS

OLE 컨트롤이 속성을 표시하는 속성 페이지 목록을 제공한다고 선언합니다.

구문

DECLARE_PROPPAGEIDS( class_name )

매개 변수

class_name
속성 페이지를 소유하는 컨트롤 클래스의 이름입니다.

설명

DECLARE_PROPPAGEIDS 클래스 선언의 끝에 있는 매크로를 사용합니다. 그런 다음 클래스의 멤버 함수를 정의하는 파일에서 .cpp 매크로, 컨트롤의 각 속성 페이지에 대한 매크로 항목 및 END_PROPPAGEIDS 매크로를 사용하여 BEGIN_PROPPAGEIDS 속성 페이지 목록의 끝을 선언합니다.

속성 페이지에 대한 자세한 내용은 ActiveX 컨트롤: 속성 페이지 문서를 참조하세요.

요구 사항

헤더afxctl.h:

DECLARE_SERIAL

serialize할 수 있는 CObject파생 클래스에 필요한 C++ 헤더 코드를 생성합니다.

DECLARE_SERIAL(class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

설명

Serialization은 파일에서 개체의 내용을 쓰거나 읽는 프로세스입니다.

모듈에서 DECLARE_SERIAL 매크로를 .h 사용한 다음 이 클래스의 개체에 액세스해야 하는 모든 .cpp 모듈에 해당 모듈을 포함합니다.

클래스 선언 IMPLEMENT_SERIAL 에 포함된 경우 DECLARE_SERIAL 클래스 구현에 포함되어야 합니다.

매크로에는 DECLARE_SERIAL 다음과 같은 모든 기능이 DECLARE_DYNAMIC 포함됩니다 DECLARE_DYNCREATE.

매크로를 AFX_API 사용하여 매크로와 IMPLEMENT_SERIAL 매크로를 사용하는 DECLARE_SERIAL 클래스의 CArchive 추출 연산자를 자동으로 내보낼 수 있습니다. 다음 코드를 사용하여 클래스 선언(파일에 있음 .h )을 괄호로 묶습니다.

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

매크로에 대한 DECLARE_SERIAL 자세한 내용은 클래스 토픽을 참조 CObject 하세요.

예시

class CAge : public CObject
{
public:
   void Serialize(CArchive& ar);
   DECLARE_SERIAL(CAge)

   // remainder of class declaration omitted

요구 사항

헤더afx.h:

IMPLEMENT_DYNAMIC

계층 내의 클래스 이름 및 위치에 대한 런타임 액세스 권한이 있는 동적 CObject파생 클래스에 필요한 C++ 코드를 생성합니다.

IMPLEMENT_DYNAMIC(class_name, base_class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

base_class_name
기본 클래스의 이름입니다.

설명

IMPLEMENT_DYNAMIC 모듈에서 매크로를 .cpp 사용한 다음 결과 개체 코드를 한 번만 연결합니다.

자세한 내용은 클래스 항목을 참조 CObject 하세요.

예시

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

요구 사항

헤더afx.h:

IMPLEMENT_DYNCREATE

매크로와 함께 DECLARE_DYNCREATE 사용할 때 런타임에 파생 클래스의 CObject개체를 동적으로 만들 수 있습니다.

IMPLEMENT_DYNCREATE(class_name, base_class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

base_class_name
기본 클래스의 실제 이름입니다.

설명

예를 들어 직렬화 중에 디스크에서 개체를 읽을 때 프레임워크는 이 기능을 사용하여 새 개체를 동적으로 만듭니다. IMPLEMENT_DYNCREATE 클래스 구현 파일에 매크로를 추가합니다. 자세한 내용은 클래스 항목을 참조 CObject 하세요.

매크로와 IMPLEMENT_DYNCREATE 매크로를 DECLARE_DYNCREATE 사용하는 경우 매크로와 멤버 함수를 CObject::IsKindOf 사용하여 RUNTIME_CLASS 런타임에 개체의 클래스를 확인할 수 있습니다.

클래스 선언 IMPLEMENT_DYNCREATE 에 포함된 경우 DECLARE_DYNCREATE 클래스 구현에 포함되어야 합니다.

이 매크로 정의는 클래스의 기본 생성자를 호출합니다. 사소한 생성자가 클래스에서 명시적으로 구현되는 경우 기본 생성자도 명시적으로 구현해야 합니다. 클래스 구현 외부에서 호출되지 않도록 기본 생성자를 클래스 private 또는 protected 멤버 섹션에 추가할 수 있습니다.

예시

class CMyDynCreateObj : public CObject
{
   int m_Num;
public:
   DECLARE_DYNCREATE(CMyDynCreateObj)
   CMyDynCreateObj(int Num) { m_Num = Num; }
private:
   CMyDynCreateObj() { m_Num = 0; }  // provide default constructor only for 
                                     // dynamic creation 
};

 

IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)

요구 사항

헤더afx.h:

IMPLEMENT_OLECREATE_FLAGS

이 매크로 또는 IMPLEMENT_OLECREATE 사용 DECLARE_OLECREATE하는 클래스에 대 한 구현 파일에 표시 해야 합니다.

구문

IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
    l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

매개 변수

class_name
클래스의 실제 이름입니다.

external_name
다른 애플리케이션에 노출된 개체 이름입니다(따옴표로 묶음).

nFlags
다음 플래그 중 하나 이상을 포함합니다.

  • afxRegInsertable OLE 개체에 대한 개체 삽입 대화 상자에 컨트롤을 표시할 수 있습니다.
  • afxRegApartmentThreading 레지스트리 ThreadingModel=Apartment의 스레딩 모델을 .로 설정합니다.
  • afxRegFreeThreading 레지스트리 ThreadingModel=Free의 스레딩 모델을 .로 설정합니다.

두 플래그 afxRegApartmentThreading 를 결합하고 afxRegFreeThreading ThreadingModel=Both를 설정할 수 있습니다. 스레딩 모델 등록에 대한 자세한 내용은 Windows SDK를 참조 InprocServer32 하세요.

lb2b5b4b8w2b7b1b6b3클래스w1의 CLSID 구성 요소, 구성 요소입니다.

설명

참고 항목

사용하는 IMPLEMENT_OLECREATE_FLAGS경우 매개 변수를 사용하여 nFlags 개체가 지원하는 스레딩 모델을 지정할 수 있습니다. 단일 읽는 모델만 지원하려면 .를 사용합니다 IMPLEMENT_OLECREATE.

외부 이름은 다른 애플리케이션에 노출되는 식별자입니다. 클라이언트 애플리케이션은 외부 이름을 사용하여 자동화 서버에서 이 클래스의 개체를 요청합니다.

OLE 클래스 ID는 개체에 대한 고유한 128비트 식별자입니다. 구문 설명에서 long1개, 2개의 **WORD**s 및 8개의 **BYTE**s로 b8lw1w2b1 구성됩니다. 애플리케이션 마법사 및 코드 마법사는 필요에 따라 고유한 OLE 클래스 ID를 만듭니다.

요구 사항

헤더afxdisp.h:

IMPLEMENT_OLECTLTYPE

컨트롤 클래스의 GetUserTypeNameID 멤버 함수와 GetMiscStatus 멤버 함수를 구현합니다.

구문

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

매개 변수

class_name
컨트롤 클래스의 이름입니다.

idsUserTypeName
컨트롤의 외부 이름을 포함하는 문자열의 리소스 ID입니다.

dwOleMisc
하나 이상의 플래그를 포함하는 열거형입니다. 이 열거형에 대한 자세한 내용은 Windows SDK를 참조 OLEMISC 하세요.

설명

또한 IMPLEMENT_OLECTLTYPE컨트롤 클래스 선언에 매크로를 DECLARE_OLECTLTYPE 추가해야 합니다.

멤버 함수는 GetUserTypeNameID 컨트롤 클래스를 식별하는 리소스 문자열을 반환합니다. GetMiscStatus 는 컨트롤의 OLEMISC 비트를 반환합니다. 이 열거형은 컨트롤의 기타 특성을 설명하는 설정 컬렉션을 지정합니다. 설정에 대한 전체 설명은 OLEMISC Windows SDK를 참조 OLEMISC 하세요.

참고 항목

ActiveX ControlWizard에서 사용하는 기본 설정은 다음과 OLEMISC_ACTIVATEWHENVISIBLEOLEMISC_CANTLINKINSIDEOLEMISC_SETCLIENTSITEFIRSTOLEMISC_INSIDEOUTOLEMISC_RECOMPOSEONRESIZE같습니다.

요구 사항

헤더afxctl.h:

IMPLEMENT_SERIAL

계층 내의 클래스 이름 및 위치에 대한 런타임 액세스 권한이 있는 동적 CObject파생 클래스에 필요한 C++ 코드를 생성합니다.

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

매개 변수

class_name
클래스의 실제 이름입니다.

base_class_name
기본 클래스의 이름입니다.

wSchema
역직렬화 프로그램이 이전 프로그램 버전에서 만든 데이터를 식별하고 처리할 수 있도록 보관에 인코딩되는 UINT "버전 번호"입니다. 클래스 스키마 번호는 -1이 아니어야 합니다.

설명

모듈에서 IMPLEMENT_SERIAL 매크로를 .cpp 사용한 다음 결과 개체 코드를 한 번만 연결합니다.

매크로를 AFX_API 사용하여 매크로와 IMPLEMENT_SERIAL 매크로를 사용하는 DECLARE_SERIAL 클래스의 CArchive 추출 연산자를 자동으로 내보낼 수 있습니다. 다음 코드를 사용하여 클래스 선언(파일에 있음 .h )을 괄호로 묶습니다.

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

자세한 내용은 클래스 항목을 참조 CObject 하세요.

예시

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

요구 사항

헤더afx.h:

RUNTIME_CLASS

C++ 클래스의 이름에서 런타임 클래스 구조를 가져옵니다.

RUNTIME_CLASS(class_name)

매개 변수

class_name
클래스의 실제 이름입니다(따옴표로 묶지 않음).

설명

RUNTIME_CLASS에서 지정class_name한 클래스의 CRuntimeClass 구조체에 대한 포인터를 반환합니다. 로 선언된 DECLARE_DYNCREATEDECLARE_DYNAMIC파생 클래스만 CObject또는 DECLARE_SERIAL 구조체에 대한 포인터를 CRuntimeClass 반환합니다.

자세한 내용은 클래스 항목을 참조 CObject 하세요.

예시

CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

요구 사항

헤더afx.h:

DECLARE_OLECREATE

OLE 자동화를 통해 파생 클래스의 CCmdTarget개체를 만들 수 있습니다.

DECLARE_OLECREATE(class_name)

매개 변수

class_name
클래스의 실제 이름입니다.

설명

이 매크로를 사용하면 다른 OLE 사용 애플리케이션에서 이 형식의 개체를 만들 수 있습니다.

클래스의 DECLARE_OLECREATE 모듈에 .h 매크로를 추가한 다음 이 클래스의 개체에 액세스해야 하는 모든 .cpp 모듈에 해당 모듈을 포함합니다.

클래스 선언 IMPLEMENT_OLECREATE 에 포함된 경우 DECLARE_OLECREATE 클래스 구현에 포함되어야 합니다. 클래스 선언도 사용하거나 DECLARE_SERIAL.DECLARE_OLECREATE를 사용해야 DECLARE_DYNCREATE 합니다.

요구 사항

헤더: afxdisp.h

IMPLEMENT_OLECREATE

이 매크로 또는 IMPLEMENT_OLECREATE_FLAGS 사용 DECLARE_OLECREATE하는 클래스에 대 한 구현 파일에 표시 해야 합니다.

IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

매개 변수

class_name
클래스의 실제 이름입니다.

external_name
다른 애플리케이션에 노출된 개체 이름입니다(따옴표로 묶음).

lb2b5b4b8w2b7b1b6b3클래스w1의 CLSID 구성 요소, 구성 요소입니다.

설명

참고 항목

기본적으로 사용하는 IMPLEMENT_OLECREATE경우 단일 스레딩 모델만 지원합니다. 사용하는 IMPLEMENT_OLECREATE_FLAGS경우 매개 변수를 사용하여 nFlags 개체가 지원하는 스레딩 모델을 지정할 수 있습니다.

외부 이름은 다른 애플리케이션에 노출되는 식별자입니다. 클라이언트 애플리케이션은 외부 이름을 사용하여 자동화 서버에서 이 클래스의 개체를 요청합니다.

OLE 클래스 ID는 개체에 대한 고유한 128비트 식별자입니다. 구문 설명에서 long1개, 2개의 **WORD**s 및 8개의 **BYTE**s로 b8lw1w2b1 구성됩니다. 애플리케이션 마법사 및 코드 마법사는 필요에 따라 고유한 OLE 클래스 ID를 만듭니다.

요구 사항

헤더: afxdisp.h

참고 항목

매크로 및 전역
MFC 공용 컨트롤 라이브러리 격리
CLSID 키