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 3) 프로젝트 옵션 II 4) Web Deployment Option 코딩을 마치고 배포에 앞서 필요한 설정입니다 최종 베포시만 “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) 설명 정의한 함수에서 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 내부로 값을 전달할 수 있다. function set() AxTest.Test = “333333”; 설명 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) m_VclCtl->edtTest->Text = AnsiString(Value);
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.cpp 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) …………… ② m_VclCtl->edtTest->Text = AnsiString(Value); } catch(Exception &e) { 사용법 <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 형인 경우 function test2() ret = AxTest.TestFunc2(); 설명 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) *ret = WideString(m_VclCtl->edtTest->Text).Copy(); ① : 이 영역에 코드를 기술한다.