인터넷의 ActiveX 컨트롤
ActiveX 컨트롤은 OLE 컨트롤 사양의 업데이트된 버전입니다.
Important
ActiveX는 새로운 개발에 사용하지 않아야 하는 레거시 기술입니다. 자세한 내용은 ActiveX 컨트롤을 참조 하세요.
컨트롤은 인터넷의 COM 인식 웹 브라우저를 포함하여 다양한 컨테이너에서 사용할 수 있는 프로그래밍 가능한 소프트웨어 구성 요소를 개발하기 위한 기본 아키텍처입니다. 모든 ActiveX 컨트롤은 인터넷 컨트롤일 수 있으며 해당 기능을 활성 문서에 추가하거나 웹 페이지의 일부가 될 수 있습니다. 웹 페이지의 컨트롤은 스크립팅을 사용하여 서로 통신할 수 있습니다.
ActiveX 컨트롤은 인터넷으로 제한되지 않습니다. 컨트롤이 해당 컨테이너에 필요한 인터페이스를 지원하는 한 모든 컨테이너에서 ActiveX 컨트롤을 사용할 수도 있습니다.
ActiveX 컨트롤에는 다음을 비롯한 몇 가지 이점이 있습니다.
이전 OLE 컨트롤보다 필요한 인터페이스 수가 적습니다.
창이 없고 항상 활성 상태일 수 있습니다.
ActiveX 컨트롤이 되려면 컨트롤이 다음을 수행해야 합니다.
인터페이스를
IUnknown
지원합니다.COM 개체여야 합니다.
DLLRegisterServer 및 DLLUnRegisterServer를 내보냅니다.
기능에 필요한 추가 인터페이스를 지원합니다.
기존 컨트롤을 인터넷에 친숙하게 만들기
인터넷 환경에서 잘 작동하는 컨트롤을 설계하려면 인터넷에서 비교적 낮은 전송 속도를 고려해야 합니다. 기존 컨트롤을 사용할 수 있습니다. 그러나 코드 크기를 더 작게 만들고 컨트롤 속성을 비동기적으로 다운로드하기 위해 수행해야 하는 단계가 있습니다.
컨트롤의 성능을 향상시키려면 효율성 고려 사항에 대한 다음 팁을 따르세요.
ActiveX 컨트롤: 최적화 문서에 설명된 기술을 구현합니다.
컨트롤을 인스턴스화하는 방법을 고려합니다.
비동기; 다른 프로그램을 보관하지 마세요.
작은 블록으로 데이터를 다운로드합니다.
비트맵 또는 비디오 데이터와 같은 큰 스트림을 다운로드하는 경우 컨테이너와 협력하여 컨트롤의 데이터에 비동기적으로 액세스합니다. 데이터를 검색할 수도 있는 다른 컨트롤과 협력하여 증분 또는 점진적 방식으로 데이터를 검색합니다. 코드를 비동기적으로 다운로드할 수도 있습니다.
백그라운드에서 코드 및 속성을 다운로드합니다.
가능한 한 빨리 사용자 인터페이스를 활성화합니다.
속성과 큰 데이터 BLOB(예: 비트맵 이미지 또는 비디오 데이터)을 모두 영구 데이터가 저장되는 방식을 고려합니다.
큰 비트맵 또는 AVI 파일과 같이 상당한 양의 영구 데이터가 있는 컨트롤은 다운로드 방법에 주의해야 합니다. 문서 또는 페이지는 가능한 한 빨리 표시될 수 있으며 컨트롤이 백그라운드에서 데이터를 검색하는 동안 사용자가 페이지와 상호 작용할 수 있습니다.
효율적인 루틴을 작성하여 코드 크기 및 런타임을 줄입니다.
몇 바이트의 영구 데이터만 있는 작은 단추 및 레이블 컨트롤은 인터넷 환경에서 사용하기에 적합하며 브라우저 내에서 잘 작동합니다.
진행률이 컨테이너에 전달되는 것을 고려합니다.
사용자가 페이지와 상호 작용을 시작할 수 있는 시기와 다운로드가 완료된 경우를 포함하여 비동기 다운로드의 진행 상황을 컨테이너에 알립니다. 컨테이너는 사용자에게 진행률(예: 완료율)을 표시할 수 있습니다.
클라이언트 컴퓨터에 컨트롤을 등록하는 방법을 고려합니다.
새 ActiveX 컨트롤 만들기
애플리케이션 마법사를 사용하여 새 컨트롤을 만들 때 비동기 모니커 및 기타 최적화에 대한 지원을 사용하도록 선택할 수 있습니다. 컨트롤 속성을 비동기적으로 다운로드하는 지원을 추가하려면 다음 단계를 수행합니다.
MFC ActiveX 컨트롤 마법사를 사용하여 프로젝트를 만들려면
파일 메뉴에서 새로 만들기를 클릭합니다.
Visual Studio C++ 프로젝트에서 MFC ActiveX 컨트롤 마법사를 선택하고 프로젝트 이름을 지정합니다.
컨트롤 설정 페이지에서 속성을 비동기적으로 로드를 선택합니다. 이 옵션을 선택하면 준비 상태 속성과 준비 상태 변경 이벤트가 설정됩니다.
ActiveX 컨트롤: 최적화에 설명된 창 없는 활성화와 같은 다른 최적화를 선택할 수도 있습니다.
마침을 선택하여 프로젝트를 만듭니다.
CDataPathProperty에서 파생된 클래스를 만들려면
에서 파생된 클래스를 만듭니다
CDataPathProperty
.컨트롤에 대한 헤더 파일이 포함된 각 원본 파일에서 이 클래스의 헤더 파일을 그 앞에 추가합니다.
이 클래스에서 재정
OnDataAvailable
의합니다. 이 함수는 데이터를 표시할 수 있을 때마다 호출됩니다. 데이터를 사용할 수 있게 되면 선택한 방식(예: 점진적으로 렌더링)을 처리할 수 있습니다.아래 코드 발췌는 편집 컨트롤에 데이터를 점진적으로 표시하는 간단한 예입니다. 편집 컨트롤을 지우기 위해 플래그 BSCF_FIRSTDATANOTIFICATION 사용합니다.
void CMyDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag) { CListCtrl list_ctrl; CEdit *edit = list_ctrl.GetEditControl(); if ((bscfFlag & BSCF_FIRSTDATANOTIFICATION) && edit->m_hWnd) { edit->SetSel(0, -1); edit->Clear(); } if (dwSize > 0) { CString string; LPTSTR str = string.GetBuffer(dwSize); UINT nBytesRead = Read(str, dwSize); if (nBytesRead > 0) { string.ReleaseBuffer(nBytesRead); edit->SetSel(-1, -1); edit->ReplaceSel(string); } } }
AFXCMN을 포함해야 합니다. 클래스를 사용하는 H입니다
CListCtrl
.컨트롤의 전반적인 상태가 변경되면(예: 로드에서 초기화됨 또는 사용자 대화형으로) 호출
COleControl::InternalSetReadyState
합니다. 컨트롤에 데이터 경로 속성이 하나만 있는 경우 BSCF_LASTDATANOTIFICATION 코드를 추가하여 컨테이너에 다운로드가 완료되었음을 알릴 수 있습니다. 예시:if (bscfFlag & BSCF_LASTDATANOTIFICATION) { GetControl()->InternalSetReadyState(READYSTATE_COMPLETE); }
OnProgress
을 재정의합니다. 에서OnProgress
최대 범위를 보여 주는 숫자와 현재 다운로드의 정도를 보여 주는 숫자가 전달됩니다. 이 숫자를 사용하여 사용자에게 완료율과 같은 상태 표시할 수 있습니다.
다음 프로시저는 방금 파생된 클래스를 사용하기 위해 컨트롤에 속성을 추가합니다.
속성을 추가하려면
클래스 뷰에서 라이브러리 노드 아래의 인터페이스를 마우스 오른쪽 단추로 클릭하고 추가, 속성 추가를 차례로 선택합니다. 그러면 속성 추가 마법사가 시작됩니다.
속성 추가 마법사에서 메서드 설정/가져오기 라디오 단추를 선택하고 속성 이름(예: EditControlText)을 입력하고 BSTR을 속성 형식으로 선택합니다.
Finish를 클릭합니다.
-derived 클래스의
CDataPathProperty
멤버 변수를 ActiveX 컨트롤 클래스에 선언합니다.CMyDataPathProperty EditControlText;
Get/Set
메서드를 구현합니다. 의 경우Get
문자열을 반환합니다. 의 경우Set
속성을 로드하고 호출SetModifiedFlag
합니다.BSTR CMFCActiveXControlCtrl::GetEditControlText(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; strResult = EditControlText.GetPath(); return strResult.AllocSysString(); } void CMFCActiveXControlCtrl::SetEditControlText(LPCTSTR newVal) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); Load(newVal, EditControlText); SetModifiedFlag(); }
DoPropExchange에서 다음 줄을 추가합니다.
PX_DataPath(pPX, _T("DataPath"), EditControlText);
ResetData를 재정의하여 다음 줄을 추가하여 컨트롤을 다시 설정하도록 속성에 알립니다.
EditControlText.ResetData();
CDataPathProperty 또는 CCachedDataPathProperty에서 파생할지 여부 결정
이전 예제에서는 컨트롤의 속성을 CDataPathProperty
파생시키는 단계를 설명합니다. 자주 변경되는 실시간 데이터를 다운로드하는 경우 모든 데이터를 유지할 필요는 없지만 현재 값만 유지하는 것이 좋습니다. 예를 들어 주식 시세 컨트롤이 있습니다.
에서 CCachedDataPathProperty
파생할 수도 있습니다. 이 경우 다운로드한 데이터는 메모리 파일에 캐시됩니다. 다운로드한 모든 데이터(예: 비트맵을 점진적으로 렌더링하는 컨트롤)를 유지해야 하는 경우 이 옵션을 선택하는 것이 좋습니다. 이 경우 클래스에는 데이터를 포함하는 멤버 변수가 있습니다.
CMemFile m_Cache;
ActiveX 컨트롤 클래스에서 이 메모리 매핑된 파일을 OnDraw
사용하여 데이터를 표시할 수 있습니다. ActiveX 컨트롤 CCachedDataPathProperty
-derived 클래스에서 기본 클래스 구현을 호출한 후 멤버 함수 OnDataAvailable
를 재정의하고 컨트롤을 무효화합니다.
void CMyCachedDataPathProperty::OnDataAvailable(DWORD dwSize, DWORD bscfFlag)
{
CCachedDataPathProperty::OnDataAvailable(dwSize, bscfFlag);
GetControl()->InvalidateControl();
}
ActiveX 컨트롤을 사용하여 비동기적으로 데이터 다운로드
네트워크를 통해 데이터를 다운로드하려면 비동기적으로 수행해야 합니다. 이렇게 하면 많은 양의 데이터가 전송되거나 연결 속도가 느린 경우 다운로드 프로세스가 클라이언트의 다른 프로세스를 차단하지 않는다는 장점이 있습니다.
비동기 모니커를 사용하면 네트워크를 통해 데이터를 비동기적으로 다운로드할 수 있습니다. 작업이 완료되지 않은 경우에도 비동기 모니커의 읽기 작업이 즉시 반환됩니다.
예를 들어 10바이트만 사용할 수 있고 읽기가 1K 파일에서 비동기적으로 호출되는 경우 읽기는 차단되지 않지만 현재 사용 가능한 10바이트로 반환됩니다.
클래스를 사용하여 비동기 모니커를 구현합니다CAsyncMonikerFile
. 그러나 ActiveX 컨트롤은 파생된 CAsyncMonikerFile
클래스를 CDataPathProperty
사용하여 비동기 컨트롤 속성을 구현하는 데 도움이 될 수 있습니다.
웹 페이지에 컨트롤 표시
다음은 웹 페이지에 컨트롤을 삽입하기 위한 개체 태그 및 특성의 예입니다.
<OBJECT
CLASSID="clsid:FC25B780-75BE-11CF-8B01-444553540000"
CODEBASE="/ie/download/activex/iechart.ocx"
ID=chart1
WIDTH=400
HEIGHT=200
ALIGN=center
HSPACE=0
VSPACE=0>
<PARAM NAME="BackColor" value="#ffffff"/>
<PARAM NAME="ForeColor" value="#0000ff"/>
<PARAM NAME="url" VALUE="/ie/controls/chart/mychart.txt"/>
</OBJECT>
새 ActiveX 컨트롤 기능을 사용하도록 기존 OLE 컨트롤 업데이트
OLE 컨트롤이 4.2 이전의 Visual C++ 버전으로 만들어진 경우 성능을 개선하고 기능을 향상시키기 위해 수행할 수 있는 단계가 있습니다. 이러한 변경 내용에 대한 자세한 내용은 ActiveX 컨트롤: 최적화를 참조 하세요.
기존 컨트롤에 비동기 속성 지원을 추가하는 경우 준비 상태 속성과 ReadyStateChange
이벤트를 직접 추가해야 합니다. 컨트롤의 생성자에서 다음을 추가합니다.
m_lReadyState = READYSTATE_LOADING;
COleControl::InternalSetReadyState를 호출 하여 코드를 다운로드할 때 준비 상태를 업데이트합니다. 호출 InternalSetReadyState
할 수 있는 한 곳은 파생 클래스의 재정의CDataPathProperty
입니다OnProgress
.