2013. 5. 7. 06:12

Plugin에서 Project 내장객체 사용하기

ActiceX 컨트롤 (반드시 컨트롤이어야 합니다.)에서 T-Set 의 Project 내장 객체를 Keep 해 두었다가 사용하는 방법은 다음과 같습니다. 


인터페이스에 Project 를 저장할 Attribute 를 하나 선언합니다.


    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
    public interface ITest
    {
        object Project
        {
            get;
            set;
        }       
    }


그리고 구현부에 위 Project 를 선언해 줍니다. 


    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Example.Test")]
    public partial class UserControl1 : UserControl, ITest
    {
        public object Project
        {
            get;
            set;
        }
    }


마지막으로 제일 중요한 건, 위 Project COM 객체를 릴리즈 해주어야 합니다. 


    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Example.Test")]
    public partial class UserControl1 : UserControl, ITest
    {
        const int WM_DESTROY = 0x0002;        

       protected override void WndProc(ref Message m)
        {            
            else if (m.Msg == WM_DESTROY)
            {
                if (this.Project != null)
                {
                    try
                    {
                        Marshal.ReleaseComObject(this.Project);
                        this.Project = null;
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }

            base.WndProc(ref m);
        }
    }


참고로, 만약 Project 를 이용하여 다른 내장 객체를 반환받은 경우에도 반드시 릴리즈 해주는 것을 잊지 마시기 바랍니다.