본문 바로가기

C#/basic

C#을 이용한 ActiveX 개발


C#을 이용한 ActiveX 개발



이번 강좌는 간단하게 알아보는 시간으로써  Step by Step강의는 현재 www.Hoons.kr에 올렸습니다.
기존 ActiveX개발을 하셨던 부분에서 C#을 이용해서도 쉽게 개발이 가능하단 점을 알려드리고자 작성합니다.


      C#을 이용한 ActiveX형식의 윈도우 응용 프로그램 작성법을 간단하게 알아보도록 하겠다. 물론 기존 개발 과는 다소 다른 점이 있지만, C#을 이용함으로써 생산성을 높이고 기존에 개발된 프로그램을 약간의 코드추가 만으로 그대로 사용 가능하다는 점이 특징이라고 할 수 있겠다.

  먼저 클래스 라이브러리 형태로 프로젝트가 구성이 되어야 한다. 그리고 dll로드 역할을 하는 UserControl

을 상속 받은 클래스가 필요하고 둘째로 웹에서 실행될 메소드에 대한 Method Interface를 구현 한다. 셋째로 웹에서 이벤트를 연결해서 사용하기 위한 Event Interface를 구현을 한다. 넷째로 이벤트에 대한 Delegate를 구현을 하고 마지막으로 중요한 스크립트 코드에 상호인식을 위한 IObjectSafety Interface를 구현을 하면 된다.


지금부터는 WindowsApplication을 GUID로 실행 할 수 있는 ActiveX 구현을 하는 샘플 코드 이다 먼저 AxLoadUI라는 클래스를 생성해서 [코드-1]과 같이 Attribute를 설정한다. UserControl은 System.Windows.Foms를 추가해서 상속을 받고, Method_info, IObjectSafety는 개별적으로 구현을 해서 상속 받는 형태의 클래스 라이브러리를 만들면 된다.


[코드-1]

[Guid("70162ADE-865B-403f-9504-A536D6B96C6B")]

    [ComVisible(true)]

    [ClassInterface(ClassInterfaceType.AutoDispatch)]

    [ComSourceInterfaces(typeof(IMethod_Event))]

    public class CAxLoadUIL : UserControl,IMethod_Info,IObjectSafety


IObjectSafety는 ActiveX에서 실행시에 안전하지 않은 코드로 인식이 되어서 나오게 되는데 이런 확인 창이 나오지 않도록 안전한 코드라는 것을 명시해 주는 Interface라고 할 수 있겠다. IObjectSafety를 [코드-2]와 같이 Interface를 구성을 하고, 상속 받은 클래스에 [코드-3]과 같이 멤버를 구현을 하면 된다.

[코드-2]

[Flags]

public enum ObjectSafetyFlags : int

    {

INTERFACESAFE_FOR_UNTRUSTED_CALLER = 1,

INTERFACESAFE_FOR_UNTRUSTED_DATA = 2,

INTERFACE_USES_DISPEX = 4,

        INTERFACE_USES_SECURITY_MANAGER = 8,

SafeType = INTERFACESAFE_FOR_UNTRUSTED_CALLER |  INTERFACESAFE_FOR_UNTRUSTED_DATA

    }

[ComVisible(true)]

    [ComImport]

    [Guid("CB5BDC81-93C1-11cf-8F20-00805F2CD064")]

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IObjectSafety

    {

        void GetInterfaceSafetyOptions(ref Guid riid, out int supportedOptions, out int enabledOptions);

        void SetInterfaceSafetyOptions(ref Guid riid, int optionSetMask, int enabledOptions);

    }


[코드-3]

#region IObjectSafety 멤버

public void GetInterfaceSafetyOptions(ref Guid riid, out int supportedOptions, out int enabledOptions)

{ supportedOptions = enabledOptions = (int)ObjectSafetyFlags. SafeType; }

 public void SetInterfaceSafetyOptions(ref Guid riid, int optionSetMask, int enabledOptions){ }

#endregion


   마지막으로 구성해야 할 부분은 [코드-4]와 같이 사용하게 될 Method, EventHandler, Event에 대한 Delegate의 Interface를 작성한다. 그리고 [DispId()]는 메소드, 프로퍼티, 이벤트 처리기 부분에 순차적으로 부여해준다.

[코드-4]

[ComVisible(false)]

 public delegate void EventHandlerOnload(int iWidth, int iHeight);

[Guid("BF2976FA-774F-472d-A3CB-AD9F3AF9F20A")]

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

[ComVisible(true)]

public interface IMethod_Info

{

 [DispId(1)]

 void ShowWindows();

 }

[Guid("34B0F8C6-424E-44d0-9145-B75175548EBF")]

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

[ComVisible(true)]

 public interface IMethod_Event

 {

   [DispId(1)]

  void OnLoad(int iWidth, int iHeight);

  }

 

이제 VisualStudio 프로젝트 속성에서 빌드 이벤트에 AxLoadUI.dll를 등록하는 명령인 줄을 추가 한다.

[C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm "$(TargetPath)" /codebase /tlb] 

등록이 완료 후 테스트를 위해서 Html파일에서 Guid를 명시해서 페이지에서 로드 하도록 <object>태그를 이용해서 추가를 하고 이벤트는 Javascript를 이용해서 연결해주면 된다.

<object id="AxObject" type="application/x-oleobject" classid="clsid:70162ADE-865B-403f-9504-A536D6B96C61" width="400" height="300"></object>

이벤트 연결 Javascript 형식은 [function AxObject::FormOnload ()] 처럼 하면 된다.

 

'C# > basic' 카테고리의 다른 글

Iexpress Cab, Exe, Zip 를 이용한 패키지 만들기  (0) 2010.01.26