프로그래밍/델파이

잘동작하던 ActiveX가 기능 추가후, 먹통이 되어 버린 경험.

채윤아빠 2010. 4. 15. 12:54
728x90
반응형
서론
기존에 잘 사용하던 ActiveX에 몇 가지 속성 및 기능을 추가할 일이 있어서 관련 작업을 하던 중에 좀 황당한 사건을 겪었습니다. 속성 및 기능 추가를 위하여 기존 프로젝트에 몇몇 새로운 유닛을 추가하고, 새로운 기능을 구현한 직후 테스트에서 잘 동작을 하였었습니다. 그러나 버그 수정을 위하여 몇번 빌드를 하고 테스트를 하던 과정중에 이상한 현상을 경험하게 되었습니다.

정말 특이하게도 그런대로 동작하던 ActiveX가 점차 꼬여 가더니, 결국에는 Type Library에서 속성을 수정하거나, 심지어 수정된 소스를 저장하려고만 하여도 델파이 IDE가 아무런 응답을 하지 않게 되버리는 문제가 발생하기 시작하였습니다. 더군다나 델파이를 재시작하고, 재부팅을 하여 겨우 ocx 빌드를 성공하여 테스트를 하려고 보면, IE가 죽지 않고 계속 남아 있다거나, regsvr32.exe를 통하여 ActiveX의 등록 및 제거시에도 regsvr32.exe가 죽지 않고 계속 프로세스가 남아 있는 현상을 겪었습니다.


해결과정
무식하게 새로 ActiveX 프로젝트를 다시 시작하는 방향으로 진행했습니다. 그나마 ActiveX의 기능이 단순하고 속성도 몇개 없었기 때문에 쓸 수 있었던 방법이죠. 그러던 중에 특정 기능을 위한 유닛을 추가하기만 하면 동일한 현상이 발생함을 알게 되었습니다.(디버깅 중에 IE를 닫으면 종료되지 않고 계속 남아서 동작중인 현상)

그래서 그 유닛으로부터 역추적을 한 결과, 추가한 유닛에서 사용하는 다른 유닛 중에 Initialization 부분에서 Forms의 Application 전역 객체를 사용한 경우가 있었습니다. 혹시하 하여 이 유닛을 사용하지 않도록 우회하여 처리하였더니, 아무런 문제 없이 성공하였습니다.


결론
새로운 기능을 위하여 필요한 유닛을 ActiveX 프로젝트에 추가할 경우에는 주의가 필요합니다. 특히나 기존 다른 폼 기반 어플리케이션을 개발하는데 사용했던 유닛이라면 더더욱 주의를 기울여야 하겠습니다. Application 전역 객체가 충돌을 일으킬 수 있습니다. 아직까지 왜 Initialization 부분에서 Application.ExeName 를 사용한 것이 문제인지 확인은 안되지만, 주의해야할 부분중 하나인것 같습니다.

어찌 보면 매우 단순한 문제였는데, 고생을 좀 했습니다. 고수의 길은 아직도 먼것만 같은...