MFC 컨트롤을 ActiveX: 직렬화
이 문서는 ActiveX 컨트롤을 serialize 하는 방법을 설명 합니다.Serialization 읽거나 디스크 파일과 같은 영구적 저장소 매체에 기록 하는 프로세스입니다.클래스의 serialization에 대 한 기본 제공 지원 Microsoft Foundation 클래스 (MFC) 라이브러리를 제공 CObject.COleControlActiveX 컨트롤 속성 교환 메커니즘을 사용 하 여이 지원을 확장합니다.
ActiveX 컨트롤에 대 한 직렬화를 재정의 하 여 구현 된 COleControl::DoPropExchange.이 함수를 로드 하는 동안 호출 하 고 컨트롤 개체의 저장 멤버 변수 또는 멤버 변수로 변경 알림 구현 하는 모든 속성을 저장 합니다.
다음 항목에서는 ActiveX 제어를 직렬화 하는 작업에 관련 된 주요 문제를 다룹니다.
구현 DoPropExchange 사용자 컨트롤 개체를 serialize 하는 함수
직렬화 프로세스를 사용자 지정합니다.
버전 지원 구현
DoPropExchange 함수 구현
ActiveX 컨트롤 마법사를 사용 하 여 컨트롤 프로젝트를 생성 하는 경우 컨트롤 클래스에는 기본 구현을 비롯 하 여 여러 가지 기본 처리기 함수가 자동으로 추가 됩니다 COleControl::DoPropExchange.다음 예제에서는 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 속성에 있는 사용자 지정 부울 CircleShape 속성의 serialization에 다음 예제에서는 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) 데이터 속성 형식을 serialize합니다. |
PX_Bool) |
형식이 부울 속성을 serialize합니다. |
PX_Color) |
색 형식 속성을 serialize합니다. |
PX_Currency) |
형식을 serialize CY (통화) 속성입니다. |
PX_Double) |
형식을 serialize 이중 속성입니다. |
PX_Font) |
글꼴 형식의 속성을 serialize합니다. |
PX_Float) |
형식을 serialize float 속성입니다. |
PX_IUnknown) |
형식의 속성을 serialize 합니다. LPUNKNOWN. |
PX_Long) |
형식을 serialize 긴 속성입니다. |
PX_Picture) |
Picture 속성 형식을 serialize합니다. |
PX_Short) |
형식을 serialize 짧은 속성입니다. |
PX_String) |
형식을 serialize CString 속성입니다. |
PX_ULong) |
형식을 serialize ULONG 속성입니다. |
PX_UShort) |
형식을 serialize USHORT 속성입니다. |
이러한 속성 교환 함수에 대 한 자세한 내용은 지 속성을 OLE 컨트롤 에 있는 MFC 참조.
DoPropExchange 기본 동작 사용자 지정
기본 구현은 DoPropertyExchange (에서처럼 이전 항목) 기본 클래스를 호출 COleControl.이 자동으로 지원 되는 속성 집합을 serialize COleControl, 컨트롤의 사용자 지정 속성만 serialize 할 보다 더 많은 저장소 공간을 사용 합니다.이 함수 호출을 제거 하면 중요 하 게 생각 하는 속성만 serialize 할 개체 수 있습니다.가 컨트롤 구현 된 스톡 속성 상태 저장 하거나 명시적으로 추가 하지 않는 한 컨트롤 개체를 로드할 때 serialize 됩니다 PX_ 를 호출 합니다.
버전 지원 구현
지원 버전 수정 된 ActiveX 컨트롤을 새로운 지속적 속성을 추가 하 고 여전히 감지 하 고 컨트롤의 이전 버전에서 만든 영구 상태를 로드할 수 있습니다.컨트롤의 버전을 사용할 수 있도록 영구 데이터의 일부로 호출 COleControl::ExchangeVersion 컨트롤의 DoPropExchange 함수.ActiveX 컨트롤을 ActiveX 컨트롤 마법사를 사용 하 여 만들어진 경우이 호출은 자동으로 삽입 됩니다.버전 지원이 필요 하지 않으면 제거할 수 있습니다.그러나 비용 컨트롤 크기가 매우 작은 (4 바이트) 자유롭게 버전 지원.
컨트롤 ActiveX 컨트롤 마법사로 만들어지지 않은 경우 호출을 추가 COleControl::ExchangeVersion 다음 줄 시작 부분에 삽입 하 여 해당 DoPropExchange 함수 (호출 하기 전에 COleControl::DoPropExchange):
void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
...
}
사용할 수 있습니다 DWORD 버전 번호입니다.ActiveX 컨트롤 마법사에 의해 생성 된 프로젝트를 사용 _wVerMinor 및 _wVerMajor 를 기본으로 합니다.이러한 프로젝트의 ActiveX 컨트롤 클래스의 구현 파일에 정의 된 전역 상수입니다.나머지를 DoPropExchange 함수를 호출할 수 있습니다 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 서식을 작성 합니다.컨트롤 형식 마지막 읽기에서 데이터를 저장 하려면 원하는 경우 전달할 FALSE 를 호출할 때 세 번째 매개 변수로 ExchangeVersion.이 세 번째 매개 변수는 선택적 이며입니다 TRUE 기본적으로.