HwpCtrl ActiveX 컨트롤에 관한 문제점 해결 방안 두 가지

Out of Process 자동화 서버와 같이 스스로 메모리 관리에 책임이 있는 형태의 COM 서버들은 메모리 충돌 오류를 일으킬 가능성이 상대적으로 적다고 볼 수 있습니다. 하지만, In Process 자동화 서버의 경우, 특히 ActiveX들은 기능이 복잡할 수록 이러한 문제를 일으킬 가능성이 큽니다. 이번에 작업한 프로그램 중 하나인 HwpCtrl을 호스팅하는 닷넷 기반 응용프로그램에서도 예외는 아니었는데, 두 가지 문제점이 있었습니다.

첫 번째: 트레이 아이콘이 정리되지 않고 잔상이 남는 문제

아래아한글 소프트웨어 연구실 (http://swlab.haansoft.com) 에도 같은 문제에 관한 FAQ가 있었습니다만 “해결할 수 없다” 는 것이 답이었습니다. 그러나, 이 답에 만족하지 못해서 인터넷 이곳저곳을 찾아다니다가 문제에 매우 훌륭하게 접근하는 소스 코드 하나를 발견하였습니다.

http://cpueblo.com/programming/api/contents/197.html

위의 아티클에서 제공한 Visual C++ 소스 코드를 C#으로 이식한 후, 정리되지 않은 아이콘이 대부분 제거가 잘 된다는 것을 확인하였습니다. 하지만 제가 해결하고자 하는 문제였던 HwpCtrl ActiveX 컨트롤의 아이콘 제거는 여전히 이루어지지 않았습니다. 단순히 프로세스 ID 값을 얻어오지 못한 경우에는 속하지 않았기 때문에 이 코드가 기대하는대로 동작해주지는 않았습니다. 따라서, 프로세스를 열도록 시도하여 존재하지 않는 프로세스임을 재 확인하는 코드를 추가해야 했습니다.

위의 소스 코드 파일은 C#을 기준으로 프로그래밍된 것이지만 기본적인 컨셉은 다른 프로그래밍 언어에서도 참고할 수 있을 것입니다. 위의 코드를 컴파일 시에는 /unsafe 스위치를 지정하여 Unsafe Code를 컴파일할 수 있도록 허용해야 합니다.

위의 코드를 호출하기 위해서는, 프로세스가 한 번 이상 종료된 상태여야 했기 때문에 진입점 메서드를 이중으로 프로그래밍했습니다. 특정한 명령줄 스위치가 전달된 경우와 그렇지 않은 경우를 구분 지어 정상 모드에서 종료한 경우 프로세스를 연이어 다시 시작하게 만들고 그 자신은 종료하게 두면, 나중에 Cleanup 모드로 시작된 프로세스에 의해 실제 트레이 아이콘 정리 작업이 발생하게 됩니다.

두 번째: 프로그램 종료 직후 발생하는 알 수 없는 메모리 위반 오류

HwpCtrl을 호스팅하는 프로세스를 종료한 직후에 발생하는 알 수 없는 메모리 위반 오류 때문에 고민이 많았습니다. 이 현상은, VSHOST.EXE에서 실행되는 Visual Studio Hosting Process 모드에서는 문제가 되지 않지만, 단독으로 응용프로그램을 실행할 때 발생하는 문제였습니다.

이 문제의 해결을 위하여 Internet Explorer Control 위에서 호스팅하도록 접근 방법을 변경해 보았습니다. 참조 대상 어셈블리의 수를 줄이고 프로그램의 크기를 줄이는 효과는 있었지만 문제는 여전히 그대로였습니다. 적당한 해결 방법이 없는 상태에서 생각해낸 최종 방법은 강제 프로세스 종료였는데 문제는 시점이었습니다.

System.Windows.Forms.Application.Run 메서드가 폼 이외에 컨텍스트 개체를 통해서 GUI 메시지 루프를 시작할 수 있다는 것을 알았고, 이 컨텍스트 개체가 제공하는 메시지 루프 이탈 시점에 발생하는 이벤트를 이용하여 프로그램을 종료하도록 하였습니다. 그리고 Main 메서드 전체에 SEH 구성을 두어 catch, finally 절 이후에 강제 종료가 일어나도록 하였습니다.

결론

위의 두 가지 방법 모두 정상적인 방법이 아니지만, 문제의 해결을 위하여 적용할 수 있었던 최선의 방법이었다고 생각합니다. 또한, 위의 방법을 적용한 경우 적용된 프로그램이 Windows Vista에서 관리자 권한을 필요로 할 수도 있습니다.

댓글 남기기