150 likes | 532 Views
ActiveX 개발 KnowHow (C++ Builder 6.0). 2004. 4. 07. ㈜ 이서비스엔지니어링. 목차 – ActiveX. ActiveX 만들기 경고창 제거하기 이벤트 변수 함수 CLSID 변경. 1.ActiveX 만들기. ActiveX. 생성 I. 1) ActiveX 최초설정. 2) 프로젝트옵션 설정. ActiveX 를 Wizard 를 사용할때 처음 나타나는 화면입니다. 보기 배포시 첨부될 파일들을 모두 ActiveX 내에 포함하기위한 설정입니다 .
E N D
ActiveX 개발 KnowHow (C++ Builder 6.0) 2004. 4. 07. ㈜ 이서비스엔지니어링
목차 – ActiveX • ActiveX 만들기 • 경고창 제거하기 • 이벤트 • 변수 • 함수 • CLSID 변경
1.ActiveX 만들기 ActiveX 생성 I 1) ActiveX 최초설정 2) 프로젝트옵션 설정 ActiveX 를 Wizard를 사용할때 처음 나타나는 화면입니다. • 보기 배포시 첨부될 파일들을 모두 ActiveX내에 포함하기위한 설정입니다. • Packages 탭의 하단에 있는 Build with Rungtime packages 의 체크를 제거합니다. * Project Manager 내용은 다른 파일의 배포 없이 사용이 가능하도록 설정하기 위함입니다.
1.ActiveX 만들기 ActiveX 생성 II 4) Web Deployment Option 3) 프로젝트 옵션 II • 코딩을 마치고 배포에 앞서 필요한 설정입니다 • 최종 베포시만 “Use CAB file compression” 를 Check 함 • “Auto increment release number” 는 Check 하지 않고 작업 배포시 버전을 수동으로 확정하고 배포 Linker 탭의 Linking 중 Use dynamic RTL을 제거합니다.
2. 경고창 제거하기 경고창 경고창 제거하기 (C++ builder 6.0) • 원소스 class ATL_NO_VTABLE TTestXImpl: VCLCONTROL_IMPL(TTestXImpl, TestX, TPanel, ITestX, DIID_ITestXEvents) • 수정소스 class ATL_NO_VTABLE TTestXImpl: VCLCONTROL_IMPL(TTestXImpl, TestX, TPanel, ITestX, DIID_ITestXEvents), public IPersistPropertyBagImpl<TAxEventXImpl>, …….……………………………. ① public IObjectSafetyImpl<TTestXImpl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA> BEGIN_COM_MAP(TTestXImpl) VCL_CONTROL_COM_INTERFACE_ENTRIES(IAxEventX) COM_INTERFACE_ENTRY_IMPL(IPersistPropertyBag) ……………………………. ① END_COM_MAP() BEGIN_CATEGORY_MAP(TTestXImpl) ……………………………… ② IMPLEMENTED_CATEGORY(CATID_SafeForScripting) IMPLEMENTED_CATEGORY(CATID_SafeForInitializing) END_CATEGORY_MAP() • 설명 ① : 파라미터 사용을 위하여 필요한 항목 ②:적당한 위치에 추가 하시면 됩니다.
3. 이벤트 이벤트 이벤트 만들기 • Type Library 에서 Event 생성 1) IAxEventXEvents 에서 메소드추가 2) Parameters 에 인자 추가 3) Registr Type Library 실행 4) 호출이벤트 생성 Ex) Fire_OnTest(&oleStr);
3. 이벤트 이벤트 이벤트 정의 및 호출 1) AxEventImpl1.h 정의 • 이벤트 매핑 class ATL_NO_VTABLE TAxEventXImpl: VCLCONTROL_IMPL(TAxEventXImpl, AxEventX, TAxEventX, IAxEventX, DIID_IAxEventXEvents), -- 중략 -- void InitializeControl() { m_VclCtl->OnActivate = ActivateEvent; m_VclCtl->OnClick = ClickEvent; m_VclCtl->OnCreate = CreateEvent; m_VclCtl->OnDblClick = DblClickEvent; m_VclCtl->OnDeactivate = DeactivateEvent; m_VclCtl->OnDestroy = DestroyEvent; m_VclCtl->OnKeyPress = KeyPressEvent; m_VclCtl->OnPaint = PaintEvent; m_VclCtl->btnTest->OnClick = Test; …………………… ① m_VclCtl->PB1->OnMouseUp = MyMouseUpEvent; …………………… ② } void __fastcall Test(TObject * Sender); ……………………③ void __fastcall MyMouseUpEvent(TObject * Sender, TMouseButton Button, TShiftState Shift, int X, int Y); …………………… ④ • 설명 ActiveForm 객체가 직접 외부 이벤트를 호출할 수 없기 때문에 중간 함수를 지정하여 함수 내에서 호출 ①,② : 폼에서 이벤트에 Mapping 할 함수 지정 ③,④ : 함수 선언 * Mapping 한 이벤트와 함수는 동일한 인수를 가져야 한다.
3. 이벤트 이벤트 이벤트 정의 및 호출 2) AxEventImpl1.cpp • 함수정의부 void __fastcall TAxEventXImpl::Test(TObject * Sender) { wchar_t* oleStr = WideString(m_VclCtl->edtTest->Text); Fire_OnTest(&oleStr); } //--------------------------------------------------------------------------- void __fastcall TAxEventXImpl::MyMouseUpEvent(TObject * Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { wchar_t* oleStr = WideString(m_VclCtl->edtTest->Text); Fire_OnTest(&oleStr); } • 설명 정의한 함수에서 Type Library 에서 생성한 이벤트를 호출한다. Ex) Fire_OnTest(&oleStr);
4. 변수 변수 변수 만들기 • Type Library 에서 변수 생성 생성 1) IAxEventX 에서 Property 추가 2) Type 지정 : BSTR 3) Registr Type Library 실행 4) 생성된 함수 확인 get_Test(BSTR* Value) set_Test(BSTR Value)
4. 변수 변수 변수 설명 • 사용법 1) Get 함수 외부에서 ActiveX 내의 어떤 값을 가져올수 있다 . <script language="JavaScript" > function get() { alert(AxTest.Test); } </script> 2) Set 함수 외부에서 ActiveX 내부로 값을 전달할 수 있다. <script language="JavaScript" > function set() { AxTest.Test = “333333”; } </script> • 설명 1) Get 함수 외부에서 ActiveX 내의 어떤 값을 가져올수 있다 . STDMETHODIMP TAxEventXImpl::get_Test(BSTR* Value) { try { *Value = WideString(m_VclCtl->edtTest->Text).Copy(); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; }; 2) Set 함수 외부에서 ActiveX 내부로 값을 전달할 수 있다. STDMETHODIMP TAxEventXImpl::set_Test(BSTR Value) { try { m_VclCtl->edtTest->Text = AnsiString(Value); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; };
4. 변수 변수 PARAM 변수를 사용하기 위한 작업 • Type Library 에서 변수 생성 생성 1) IAxEventX 에서 Property 추가 2) Type 지정 : BSTR 3) Registr Type Library 실행 4) 생성된 함수 확인 get_Test(BSTR* Value) set_Test(BSTR Value)
4. 변수 변수 파라미터 내용 설명 • AxEventImpl1.h BEGIN_PROPERTY_MAP(TDIYFtpImpl) PROP_ENTRY("Param",17,CLSID_NULL) ……………… ① // PROP_PAGE(CLSID_DIYFtpPage) END_PROPERTY_MAP() • AxEventImpl1.cpp STDMETHODIMP TAxEventXImpl::get_Param(BSTR* Value) { try { } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; }; STDMETHODIMP TAxEventXImpl::set_Param(BSTR Value) …………… ② { try { m_VclCtl->edtTest->Text = AnsiString(Value); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; }; • 사용법 <OBJECT name="AxTest" classid="clsid:AEB2CFE9-195F-4FAD-9F28-5E903D769F05" width=500 height=250 align=center hspace=0 vspace=0 > <PARAM NAME="Param" VALUE="Param Test"> </OBJECT> • 설명 ① : Property 의 ID 를 확인 후 PROP_ENTRY("Param",17,CLSID_NULL) 를 수동으로 추가 한다. ② : 파라미터는 set_함수만 정의 한다.
5. 함수 함수 함수 만들기 I • Type Library 에서 함수 생성 1) IAxEventX 에서 Method 추가 2) Parameters 지정 3) Registr Type Library 실행 4) 생성된 함수 확인 TestFunc(BSTR val, long* ret)
5. 함수 함수 함수 만들기 II • Type Library 에서 함수 생성 1) IAxEventX 에서 Method 추가 2) Parameters 지정 - 리턴값인경우 . 포인터형 선언 . Parameters Flags 를 Out, RetVal 로 Check 한다. 3) Registr Type Library 실행 4) 생성된 함수 확인 TestFunc(BSTR val, long* ret)
5. 함수 함수 함수 설명 • 사용법 1) 입력인자와 리턴타입이 long 인 함수 <script language="JavaScript" > function test1() { var ret; ret = AxTest.TestFunc("함수테스트"); alert(ret); } </script> 2) 리턴타입이 BSTR 형인 경우 <script language="JavaScript" > function test2() { ret = AxTest.TestFunc2(); alert(ret); } </script> • 설명 1) 입력인자와 리턴값이 long 타입인 경우 STDMETHODIMP TAxEventXImpl::TestFunc(BSTR val, long* ret) { try { ShowMessage(AnsiString(val)); …………………… ① *ret = 10000; } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; }; 2) 리턴타입이 BSTR 형인 경우 STDMETHODIMP TAxEventXImpl::TestFunc2(BSTR* ret) { try { *ret = WideString(m_VclCtl->edtTest->Text).Copy(); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IAxEventX); } return S_OK; }; ① : 이 영역에 코드를 기술한다.