Download presentation
Presentation is loading. Please wait.
1
제 4장 Visual C++ COM 컴파일러
2
Type Library Type Library AddBack.idl COM 컴포넌트가 노출하는 COM 개체에 대한 정보 포함
.tlb 확장자 . 일종의 복합 도큐먼트 COM 개체에 대한 매뉴얼 MIDL AddBack.idl AddBack.tlb(서버 COM에 대한 모든 정보르 담고있는 바이너리 파일 #import “AddBack.tlb” AddBack.tlh(스마트 포인터) AddBack.tli(COM 메서드 호출 하는 구현코드) Visual C++ 컴파일러
3
Visual C++ COM 지원 Visual C++ 컴파일러는 COM 을 지원하기 위해 다음과 같은 예약어와 클래스를 추가로 제공한다. #import __declspec 확장 속성: uuid 및 property __uuidof _com_ptr_t 클래스 _com_error 클래스 _bstr_t 클래스 _variant_t 클래스 이들을 통해 COM Client 어플리케이션을 쉽게 작성할 수 있다.
4
C++ 언어 확장 __declspec(uuid()) : GUID 지정 __uuidof() : GUID 꺼내오기
struct __declspec(uuid(“60bbxxxxx-a07f-xxxx-xxxx-xxxxxxxx”)) AddBack; struct __declspec(uuid(“4122xxxxx-a07f-xxxx-xxxx-xxxxxxxx”)) IAddEnd; __uuidof() : GUID 꺼내오기 (COM 개체나 인터페이스의 GUID 값을 얻어올때 __uuidof(AddBack) __uuidof(IAddEnd)
5
스마트 포인터 클래스 _com_ptr_t 클래스 스마트 포인터 기능을 갖고 있는 템플릿 클래스
_COM_SMARTPTR_TYPEDEF(IAddEnd, __uuidof(IAddEnd); typedef _com_ptr_t<_com_IID<IAddEnd, __uuidof(IAddEnd>> IAddEndPtr; IAddEnd 인터페이스가 IAddEndPtr 스마트 포인터 클래스 안에 캡슐화 됨 IAddEnd* 데이터형 대신 IAddEndPtr 데이터형을 사용 IUnknown 인터페이스의 메서드를 사용하지 않고도 편리하게 IAddEnd 인터페이스를 사용할 수 있다.
6
인스턴스 생성 방법 1 방법 2 방법 3 HRESULT hr; IAddEndPtr pIAddEnd;
hr = pIAddEnd.CreateInstance(uuidof(AddBack)); if(SUCCEEDED(hr)) 방법 1 hr = pIAddEnd.CreateInstance(CLSID_AddBack); if(SUCCEEDED(hr)) 방법 2 hr = pIAddEnd.CreateInstance(“AddBack.AddBack.1”); if(SUCCEEDED(hr)) 방법 3
7
AddFront 예제 작성 “제5장 Active Template Library 의 개요”에
구현되어 있는 AddBack COM Server 를 사용하는 클라이언트 어플리케이션 구현입니다.
8
AddFront 예제 프로그램 AddBack COM 컴포넌트 등록
Visual C++ 개발환경에서 예제 프로그램이 설치되어 있는 AddBack 폴더에서 AddBack.dsw 파일을 연다 AddBack 프로젝트를 Debugging Mode 로 Rebuild 하여 AddBack.dll 을 생성한다. Build 과정에서 AddBack COM 컴포넌트는 레지스트리에 등록된다.
9
MFC Dialog Based App
10
DialogBox 편집 Ctrl+더블클릭 Alt+더블클릭 IDC_ADDEND IDC_ADD IDC_ADDTEN
short m_nAddEnd IDC_ADD IDC_ADDTEN IDC_CLEAR IDOK IDC_SUM (Read Only) short m_nSum
11
Message Handler 설치 ctrl+w
12
AddFront 생성 준비작업 COM 라이브러리 초기화 코드 추가 StdAfx.h 헤더파일 변경
BOOL CAddFrontApp::InitInstance() { // Standard initialization … AfxOleInit(); // 이하 생략, COM라이브러리에 대한 초기화 작업 StdAfx.h 헤더파일 변경 #include <afxcmn.h> // MFC support for Windows Common Controls #endif // _AFX_NO_AFXCMN_SUPPORT // tlb로 부터 tlh파일과 tli파일을 얻어낸다. #include <afxdisp.h> #import "..\AddBack\AddBack.tlb" no_namespace
13
AddFront 생성 AddFrontDlg.h 변수 선언 정의하지 않았는데 사용가능하다.
class CAddFrontDlg : public CDialog { // 중간생략 // Implementation protected: IAddPtr m_pIAdd; // 스마트 포인터 클래스 IAddEndPtr m_pIAddEnd; // .. HICON m_hIcon; }; 정의하지 않았는데 사용가능하다. Tlb를 import 시키면 ATL 위저드가 자동으로 생성시킨다. IAddPtr을 Iadd에 대한 스마트 포인터라 한다. Tlb는 COM객체의 인터페이스들에 대해 _com_ptr_t 템플릿을 사용하여 스마트 클 래스를 정의한 후 이를 클라이언트에 제공한다.
14
Destructor 구현 AddFrontDlg.h 에 함수 원형 선언 AddFrontDlg.cpp 에 Destructor 구현
class CAddFrontPDlg : public CDialog { // Construction public: CAddFrontDlg(CWnd* pParent = NULL); // constructor ~CAddFrontDlg(); AddFrontDlg.cpp 에 Destructor 구현 CAddFrontDlg::~CAddFrontDlg() { m_pIAddEnd = 0; m_pIAdd = 0; }
15
AddFront 생성 CAddFrontDlg::OnInitDialog 멤버함수
BOOL CAddFrontDlg::OnInitDialog() { CDialog::OnInitDialog(); // 중간 생략 // TODO: Add extra initialization here // 스마트 포인터를 초기화 한다. m_pIAddEnd = IAddEndPtr(__uuidof(AddBack)); m_pIAdd = m_pIAddEnd; m_nAddEnd = m_pIAddEnd->AddEnd; m_nSum = m_pIAddEnd->Sum; UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control }
16
member 함수 구현 CAddFrontDlg::OnAdd 멤버함수 void CAddFrontDlg::OnAdd() {
// TODO: Add your control notification handler code here UpdateData(TRUE); m_pIAddEnd->AddEnd = m_nAddEnd; m_pIAdd->Add(); m_nSum = m_pIAddEnd->Sum; UpdateData(FALSE); }
17
Member 함수 구현 CAddFrontDlg::OnAddTen CAddFrontDlg::OnClear
void CAddFrontDlg::OnAddten() { // TODO: Add your control notification… UpdateData(TRUE); m_pIAdd->AddTen(); m_nSum = m_pIAddEnd->Sum; UpdateData(FALSE); } void CAddFrontDlg::OnClear() { // TODO: Add your control notification… UpdateData(TRUE); m_pIAddEnd->Clear(); m_nSum = m_pIAddEnd->Sum; UpdateData(FALSE); }
18
Build 수고하셨습니다. 여기까지 AddFront COM Client 제작과정 이었습니다.
(Build) 하시고 Error 가 없는지 확인하시기 바랍니다.
19
Component 분석 AddBack_I.c AddBack_p.c AddBack.idl Dlldata.c AddBack.tlb
AddBack_I.c : IID 정의 코드 AddBack_p.c 과 DllData.c 파일 : 프록시 / 스텁 코드 AddBack.tlb : 서버 COM 개체에 대한 모든 정보를 담고있는 바이너리 파일
20
Client 분석 AddBack.tlh AddBack.tlb AddBack.til
AddBack.til : 실제로 COM 개체의 메서드를 호출하는 구현코드
21
Sample 작성
22
작성할 컴포넌트 Property Gas Mineral Probe 개체의 Gas 량에 대한 get/put 작업
Probe 개체의 Mineral 량에 대한 get/put 작업 Method AddGas AddMineral Probe 개체의 Gas 량을 8만큼씩 증가시킨다 Probe 개체의 Mineral 량을 10만큼씩 증가시킨다.
23
변경된 사양
24
Client
Similar presentations