C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[3822] Re:[질문]builder에서 MDI Child 폼을 Dll로 만들어서 사용하고 싶습니다.
김대영 [] 3738 읽음    2000-07-27 00:00
관련된 질문과 답들이 830번 ~ 870번 사이에 아직도 있더군요.
참고하시기 바랍니다.

아래는 예전에 제가 올렸던 질문에 대한 임프님의 답변 중 일부입니다.

--------------------------------------------------------------
임펠리테리입니다.
쩝.. 죄송합니다. 해본지가 꽤 오래되어서 상당히 혼동했습니다.

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을 언로드하기 직전에 다시 복원해줘야 합니다. 이 방법은 스스로 하실 수 있겠지요?

그럼 참고하시길... 



정일권 님이 쓰신 글 :
: MDI Child 폼을 Dll로 만들어서 사용하고 싶은데 어떻게해야 할지 모르겠습니다
:
: 간단한 예제좀 부탁합니다.
:
: 이런 저런 방법을 다 사용해 보았는데 잘 안되네요...
:
: 꼭 좀 가르쳐 주세요... 저한데 정말 중요한 문제 입니다.
:
:

+ -

관련 글 리스트
3823 VCL 클래스 구조?? 3381 2000/07/27
3822     Re:[질문]builder에서 MDI Child 폼을 Dll로 만들어서 사용하고 싶습니다. 김대영 3738 2000/07/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.