Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[121] ActiveX Library 와 JavaScript 간의 데이터 교환
김선열 [webnclick] 7997 읽음    2007-09-20 10:27
이번에 Internet Explorer 7 환경에서 사용되는 프로그램 개발하였는데
굳이 폼까지 포함할 필요가 없어 ActiveX Library 로 개발하였습니다.

Activex Form 에 대한 예는 있는데 ActiveX Library에 대한 예는 없는 것같아
소스와 실제 구현예제를 올리니 필요하신 분 참고하세요..


/////////////////////////////////////////////////////////////////////
// ActiveX Library 생성
//

1. 파일 > New > ActiveX > ActiveX Library 생성
2. 파일 > New > ActiveX > Automation Object 추가
  - CoClass Name 에 "AxLibTest"
  - "Generate Event support Code" 체크
3. 프로젝트명 AxLibTest.dpr, 메인소스파일명 uAxLibTest.pas로 소스 저장
4. AxLibTest_TLB.pas 선택 후 F12 키 클릭으로 타입라이브러리 속성창 open
5. IAxLibTest 트리에서 마우스 오른쪽 버튼 클릭 > New > Method 클릭
   - Method명을 showmsg 으로 변경
   - Method "showmsg" 선택 후 오를쪽 Parameters 선택
   - 파리미터명 "AMsg", 파라미터 타입 "BSTR" 추가
6. 타입라이브러리 속성 창 상단의 Refresh Implementation 클릭 > 속성 창 닫기
7. uAxLibTest.pas 선택 > uses 절에 Dialogs 추가
8. Showmessage 를 사용하기 위하여 uses 절에 Dialogs 유닛을 추가
9. "procedure TAxLibTest.showmsg(const AMsg: WideString);" 구문에
    Dialogs.showmessage('웹으로부터 전달받은 값'#13 + AMsg);  을 입력 <--

///////////////////////////////////////////////////////////////////////
// ActiveX Library를 안전한 것으로 표시
//

10. 먼저 아래와 같이 다중상속을 받는 부분에 IPersistPropertyBag과
   IObjectSafety를 추가
  
   TAxLibTest = class(TAutoObject, IConnectionPointContainer, IAxLibTest, IPersistPropertyBag,
       IObjectSafety)      
11. BOOL 타입을 사용하기 위해 uses 절에  Windows 유닛 추가
12. TAxLibTest 클래스에 protected 로 아래와 같이 선언부 추가
   
  {
  ******************************************************************************
  *             안전한 것으로 표시된 ActiveX Control 선언 시작                 *
  ******************************************************************************
  }
  protected
    // 파라미터 넘어오는 것 테스트를 위한 변수 임의 선언..
    msServerIP : string;

    // IPersistPropertyBag 구현을 위한 추가부분..
    // 태크를 통해 ActiveX 컨트롤로 정보전달을 위해서..
    function IPersistPropertyBag.GetClassID = PersistPropBagGetClassID;
    function IPersistPropertyBag.initNew = PersistPropBagInitNew;
    function IPersistPropertyBag.Load = PersistPropBagLoad;
    function IPersistPropertyBag.Save = PersistPropBagSave;
    function PersistPropBagGetClassID(out classID : TCLSID) : HResult;
        stdcall;
    function PersistPropBagInitNew : HResult; stdcall;
    function PersistPropBagLoad(const pPropBag:IPropertyBag;
                                const pErrorLog:IErrorLog) : HResult; stdcall;
    function PersistPropBagSave(const pPropBag:IPropertyBag; fClearDirty:BOOL;
                                   fAveAllProperties:BOOL) : HResult; stdcall;

    // IObjectSafety 구현을 위한 추가부분..
    // 안전하지 못하다는 보안메시지를 나오지 않게하기 위해서..
    function ObjectSafetyGetInterfaceSafetyOptions(const IID: TIID;
             pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult; stdcall;
    function IObjectSafety.GetInterfaceSafetyOptions =
                   ObjectSafetyGetInterfaceSafetyOptions;
    function ObjectSafetySetInterfaceSafetyOptions(const IID: TIID;
                   dwOptionSetMask, dwEnabledOptions: DWORD): HResult; stdcall;
    function IObjectSafety.SetInterfaceSafetyOptions =
                   ObjectSafetySetInterfaceSafetyOptions;
  {
  ******************************************************************************
  *             안전한 것으로 표시된 ActiveX Control 선언 종료                 *
  ******************************************************************************
  }
13. 12항 에서 선언한 method 들을 구현부에 아래와 같이 구현

  {
  ********************************************************************************
  *             안전한 것으로 표시된 ActiveX Control 구현 시작                   *
  ********************************************************************************
  }
 
  // IPersistPropertyBag의 method들의 구현부..
  function TAxLibTest.PersistPropBagGetClassID(out classID: TCLSID) : HResult;
  begin
    Result := S_OK;
  end;
 
  function TAxLibTest.PersistPropBagInitNew : HResult;
  begin
    Result := S_OK;
  end;
 
  function TAxLibTest.PersistPropBagLoad(const pPropBag: IPropertyBag;
                                         const pErrorLog:IErrorLog) : HResult;
  var
    v : OleVariant ;
  begin
    if pPropBag.Read('ServerIP',v,pErrorLog)=S_OK then
    begin
      msServerIP := v;
    end;
    Result := S_OK;
  end;
 
  function TAxLibTest.PersistPropBagSave(const pPropBag:IPropertyBag;
                            fClearDirty:BOOL; fAveAllProperties:BOOL) : HResult;
  var
    v : OleVariant ;
  begin
    v := msServerIP ;
    pPropBag.Write('ServerIP',v) ;
    Result := S_OK;
  end;
 
 
  // IObjectSafety의 method들의 구현부..
  function TAxLibTest.ObjectSafetyGetInterfaceSafetyOptions(const IID: TIID;
                        pdwSupportedOptions, pdwEnabledOptions: PDWORD): HResult;
  begin
    Result := S_OK;
  end;
 
  function TAxLibTest.ObjectSafetySetInterfaceSafetyOptions(const IID: TIID;
                     dwOptionSetMask, dwEnabledOptions: DWORD): HResult;
  begin
    Result := S_OK;
  end;
 
  {
  ********************************************************************************
  *             안전한 것으로 표시된 ActiveX Control 구현 종료                   *
  ********************************************************************************
  }
 
14. 컴파일 하면 bin 폴더에 AxLibTest.dll 가 생성 됨

//////////////////////////////////////////////////////////////////////////////////
//  AxLibTest.dll에서 구현한 method를 호출학 위한 웹 페이지 작성
//

15. AxLibTest.htm 이름으로 bin 폴더에 웹 문서를 생성하고 아래와 같이 작성
    - 참고. 아래 OBJECT 태그에 입력할 CLASSID는 AxLibTest_TLB.pas 의 CLASS_AxLibTest로 정의된 값임

  ActiveX Library와 자바스크립트간 데이터 교환
Param1:ActiveX Library로 보낼 메시지 입력



+ -

관련 글 리스트
121 ActiveX Library 와 JavaScript 간의 데이터 교환 김선열 7997 2007/09/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.