다음을 통해 공유


MFC ActiveX 컨트롤: Serialize

이 문서에서는 ActiveX 컨트롤을 직렬화하는 방법을 설명합니다. 직렬화는 디스크 파일과 같은 영구 스토리지 매체에서 읽거나 쓰는 프로세스입니다. MFC(Microsoft Foundation Class) 라이브러리는 클래스 CObject의 serialization에 대한 기본 제공 지원을 제공합니다. COleControl 는 속성 교환 메커니즘을 사용하여 ActiveX 컨트롤로 이 지원을 확장합니다.

Important

ActiveX는 새로운 개발에 사용하지 않아야 하는 레거시 기술입니다. ActiveX를 대체하는 최신 기술에 관한 자세한 내용은 ActiveX 컨트롤을 참조하세요.

ActiveX 컨트롤에 대한 serialization은 COleControl::D oPropExchange를 재정의하여 구현됩니다. 컨트롤 개체를 로드하고 저장하는 동안 호출되는 이 함수는 멤버 변수 또는 변경 알림이 있는 멤버 변수로 구현된 모든 속성을 저장합니다.

다음 항목에서는 ActiveX 컨트롤 직렬화와 관련된 기본 문제에 대해 설명합니다.

DoPropExchange 함수 구현

ActiveX 컨트롤 마법사를 사용하여 컨트롤 프로젝트를 생성하면 COleControl::D oPropExchange기본 구현을 포함하여 여러 기본 처리기 함수가 컨트롤 클래스에 자동으로 추가됩니다. 다음 예제에서는 ActiveX 컨트롤 마법사를 사용하여 만든 클래스에 추가된 코드를 보여 줍니다.

void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   // TODO: Call PX_ functions for each persistent custom property.
}

속성을 영구적으로 만들려면 속성 교환 함수에 호출을 추가하여 수정 DoPropExchange 합니다. 다음 예제에서는 사용자 지정 부울 CircleShape 속성의 serialization을 보여 줍니다. 여기서 CircleShape 속성의 기본값 은 TRUE입니다.

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

다음 표에서는 컨트롤의 속성을 serialize하는 데 사용할 수 있는 속성 교환 함수를 나열합니다.

속성 교환 함수 목적
PX_Blob( ) BLOB(Binary Large Object) 데이터 속성을 serialize합니다.
PX_Bool( ) 형식 부울 속성을 직렬화합니다.
PX_Color( ) 형식 색 속성을 직렬화합니다.
PX_Currency( ) 형식 CY (통화) 속성을 serialize합니다.
PX_Double( ) 형식 double 속성을 serialize합니다.
PX_Font( ) 글꼴 형식 속성을 serialize합니다.
PX_Float( ) 형식 float 속성을 serialize합니다.
PX_IUnknown( ) 형식 LPUNKNOWN의 속성을 serialize합니다.
PX_Long( ) 형식 long 속성을 serialize합니다.
PX_Picture( ) Picture 형식 속성을 직렬화합니다.
PX_Short( ) 형식 short 속성을 serialize합니다.
PXstring( ) 형식 CString 속성을 serialize합니다.
PX_ULong( ) 형식 ULONG 속성을 직렬화합니다.
PX_UShort( ) 형식 USHORT 속성을 직렬화합니다.

이러한 속성 교환 함수에 대한 자세한 내용은 MFC 참조에서 OLE 컨트롤의 지속성을 참조하세요.

DoPropExchange의 기본 동작 사용자 지정

이전 항목과 같이 기본 구현 DoPropertyExchange 은 기본 클래스 COleControl를 호출합니다. 이렇게 하면 컨트롤의 사용자 지정 속성만 직렬화하는 것보다 더 많은 스토리지 공간을 사용하는 속성 집합이 자동으로 지원 COleControl됩니다. 이 호출을 제거하면 개체가 중요한 속성만 직렬화할 수 있습니다. 컨트롤에 대한 PX_ 호출을 명시적으로 추가 하지 않는 한 컨트롤이 구현한 스톡 속성 상태는 컨트롤 개체를 저장하거나 로드할 때 직렬화되지 않습니다.

버전 지원 구현

버전 지원을 사용하면 수정된 ActiveX 컨트롤에서 새 영구 속성을 추가할 수 있으며, 이전 버전의 컨트롤에서 만든 영구 상태를 검색하고 로드할 수 있습니다. 컨트롤의 버전을 영구 데이터의 일부로 사용할 수 있도록 하려면 컨트롤 DoPropExchange 의 함수에서 COleControl::ExchangeVersion을 호출합니다. ActiveX 컨트롤 마법사를 사용하여 ActiveX 컨트롤을 만든 경우 이 호출이 자동으로 삽입됩니다. 버전 지원이 필요하지 않은 경우 제거할 수 있습니다. 그러나 버전 지원에서 제공하는 추가 유연성에 대한 제어 크기 비용은 매우 작습니다(4바이트).

ActiveX 컨트롤 마법사를 사용하여 컨트롤을 만들지 않은 경우 함수의 DoPropExchange 시작 부분에 다음 줄을 삽입하여 호출을 COleControl::DoPropExchange추가 COleControl::ExchangeVersion 합니다(호출 전).

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
}

모든 DWORD 를 버전 번호로 사용할 수 있습니다. ActiveX 컨트롤 마법사에서 생성된 프로젝트는 기본값으로 사용합니다 _wVerMinor _wVerMajor . 다음은 프로젝트 ActiveX 컨트롤 클래스의 구현 파일에 정의된 전역 상수입니다. 함수의 DoPropExchange re기본der 내에서 언제든지 CPropExchange::GetVersion을 호출하여 저장하거나 검색하는 버전을 검색할 수 있습니다.

다음 예제에서 이 샘플 컨트롤의 버전 1에는 "ReleaseDate" 속성만 있습니다. 버전 2는 "OriginalDate" 속성을 추가합니다. 컨트롤이 이전 버전에서 영구 상태를 로드하도록 지시된 경우 새 속성의 멤버 변수를 기본값으로 초기화합니다.

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
   if (pPX->GetVersion() >= MAKELONG(0, 2))
   {
      PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
   }
   else
   {
      if (pPX->IsLoading())
         m_OriginalDate = 0;
   }
}

기본적으로 컨트롤은 이전 데이터를 최신 형식으로 "변환"합니다. 예를 들어 컨트롤 버전 2가 버전 1에 의해 저장된 데이터를 로드하는 경우 다시 저장될 때 버전 2 형식을 작성합니다. 컨트롤이 마지막으로 읽은 형식으로 데이터를 저장하려면 호출ExchangeVersion할 때 FALSE를 세 번째 매개 변수로 전달합니다. 이 세 번째 매개 변수는 선택 사항이며 기본적으로 TRUE입니다.

참고 항목

MFC ActiveX 컨트롤