2007년 08월 07일
DLL에서 MDI Child 폼 사용하는 방법.
임펠리테리입니다.
쩝.. 죄송합니다. 해본지가 꽤 오래되어서 상당히 혼동했습니다.
dll로부터 MDI 차일드 폼을 불러와서 보여주려고 하면 말씀하신대로 익셉션이 뜨면서 폼이 생성
되지 않습니다. ("Cannot create form ; No MDI forms are currently active")
이유는 MDI 차일드폼이 MDI 패어런트 폼을 찾는 메커니즘 때문입니다. 폼이 MDI 차일드면 vcl은
좀 무식하게도, Application::MainForm 프로퍼티를 MDI 패어런트로 인식하고 찾게 됩니다.
그런데, dll의 경우에는 Application 오브젝트에 MainForm이 없으므로 이런 익셉션이 발생하는
겁니다.
해결 방법은 dll 내부에서 원래의 Application 객체의 포인터를 dll을 호출하는 측의 Application
포인터로 세팅하는 것입니다. MainForm 프로퍼티만 바꿔치기할 수 있으면 가장 좋겠습니다만,
Application::MainForm 프로퍼티는 리드온리 프로퍼티라서 실행중에 바꿀 수 없습니다.
그래서.. dll 프로젝트 내에서, 차일드폼을 생성하기 직전에 다음과 같은 한줄을 추가하면 됩니다.
Application = ParentApp;
물론 여기서 ParentApp는 함수의 인자로 받아온 dll 호출측의 Application 포인터입니다.
여기서 한가지 주의할 것이 있습니다. Application 객체는 종료될 때 자신이 파괴해야 할 객체들의
리스트를 저장하고 있다가 종료될 때 그 객체들을 차례로 파괴하는데, 앞에서처럼 Application
객체를 바꿔치기하고나면 그런 메커니즘이 제대로 동작하지 않아서 억세스바이얼레이션이 발생
합니다. 그러므로, Application 객체를 바꿔치기하기 전에 이 Application 의 값을 저장해뒀다가
dll을 언로드하기 직전에 다시 복원해줘야 합니다. 이 방법은 스스로 하실 수 있겠지요?
------------볼랜드포럼 임펠리텔리님 글
쩝.. 죄송합니다. 해본지가 꽤 오래되어서 상당히 혼동했습니다.
dll로부터 MDI 차일드 폼을 불러와서 보여주려고 하면 말씀하신대로 익셉션이 뜨면서 폼이 생성
되지 않습니다. ("Cannot create form ; No MDI forms are currently active")
이유는 MDI 차일드폼이 MDI 패어런트 폼을 찾는 메커니즘 때문입니다. 폼이 MDI 차일드면 vcl은
좀 무식하게도, Application::MainForm 프로퍼티를 MDI 패어런트로 인식하고 찾게 됩니다.
그런데, dll의 경우에는 Application 오브젝트에 MainForm이 없으므로 이런 익셉션이 발생하는
겁니다.
해결 방법은 dll 내부에서 원래의 Application 객체의 포인터를 dll을 호출하는 측의 Application
포인터로 세팅하는 것입니다. MainForm 프로퍼티만 바꿔치기할 수 있으면 가장 좋겠습니다만,
Application::MainForm 프로퍼티는 리드온리 프로퍼티라서 실행중에 바꿀 수 없습니다.
그래서.. dll 프로젝트 내에서, 차일드폼을 생성하기 직전에 다음과 같은 한줄을 추가하면 됩니다.
Application = ParentApp;
물론 여기서 ParentApp는 함수의 인자로 받아온 dll 호출측의 Application 포인터입니다.
여기서 한가지 주의할 것이 있습니다. Application 객체는 종료될 때 자신이 파괴해야 할 객체들의
리스트를 저장하고 있다가 종료될 때 그 객체들을 차례로 파괴하는데, 앞에서처럼 Application
객체를 바꿔치기하고나면 그런 메커니즘이 제대로 동작하지 않아서 억세스바이얼레이션이 발생
합니다. 그러므로, Application 객체를 바꿔치기하기 전에 이 Application 의 값을 저장해뒀다가
dll을 언로드하기 직전에 다시 복원해줘야 합니다. 이 방법은 스스로 하실 수 있겠지요?
------------볼랜드포럼 임펠리텔리님 글
# by | 2007/08/07 09:15 | 트랙백 | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]