코딩하는 나귀

델파이 옛날 버전 부터 있었던 버그라네요;

5부터... 제가 쓰고 있는 2007 까지...

원인에 대해서 한델 이광수님의 글을 퍼왔습니다.

자료가 D7에서 ActiveX를 제작하시는 분들이 많아서 2007용 수정된 파일은 못찿겠네요;

그래서 그냥 D7에 수정된 내용을 D2007파일에 붙여 넣어 만들었습니다.

필요하신 분들 사용하세요. 원본파일은 백업 해놓으세요.


...
문제의 원인은 axctrls.pas의 ParkingWindow펑션에서 일어납니다.

소스 코드를 보시면 파킹윈도우를 만들기 위해서 registerclass를 하게 됩니다.
보통 윈도우 클래스는 윈도우를 처리하기 위한 프로시져를 가지는데요.
이게 처음 메모리에 로딩되는 ocx의 것을 사용하게 됩니다.

그런데 ie와 같이 프로세스는 하나이고 빈번하게 ocx가 로딩되고
언로드 되는 과정에서 등록한 클래스의 처리 루틴이 메모리에 로딩되고
다시 떨어질때 문제가 생기는 것으로 보입니다.

즉 2개 이상의 delphi ocx를 사용하는 경우에
ie상에서 새창에 ocx를 띄울 때

1번 ocx가 올라 갈때 는 문제가 없다가
2번 ocx가 올라 갈때 문제가 생깁니다. 이때 1번 ocx가 언로드 중이라면
2번 ocx는 클래스는 레지스트 된것으로 생각하고, 윈도우 proc을 1번
ocx것을 사용하게 되는데 1번 ocx는 메모리에서 언로드 된 상황이라
access violation을 일으키게 됩니다. (에러의 정확한 위치는 CreateWindowEx에서 생기게 됩니다.)
...