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
[2757] Re:[재질문] MDI의 child form을 dll로 구성하려면..
박지훈.임프 [cbuilder] 4325 읽음    2000-01-17 00:00
김대영 님이 쓰신 글 :
: 먼저 답변 고맙습니다.
: 임프님의 답변중에 다음 부분이 이해가 가지 않더군요.
:
: >> "만약 생성자의 코드에서 베이스생성자에 Owner로서 넘겨받았던 ParentApp를 다시
: >> 념겨줘야 합니다."
:
:
: 저는 차일드의 생성자로 디폴트 생성자를 변경해서 사용했습니다.
: ----------------------------------------------------------------------------
: public:        // User declarations
:     __fastcall TForm1(TComponent* Owner, HANDLE ParentHandle);
: ----------------------------------------------------------------------------
: __fastcall TForm1::TForm1(TComponent* Owner, HANDLE ParentHandle)
:     : TForm(Owner)
: {
: }
: ----------------------------------------------------------------------------
: 위 코드가 child form으로 생성된 기본 코드에서 변경한 전부입니다.
: 어디서 소스를 본것은 아니고 일반 MDI 구조의 Application을 만든 후
: child의  source만 DLL code에서 사용하도록 한 것입니다.
: (본거라면 다 보고 제대로 했을텐데..)
: 추가한 ParentHandle은 나중에 사용하려고 넣어둔 것이구요.
:
: 추가 질문으로서 충분했는지 모르겠네요.
: 감사합니다.
:


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

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

그럼 참고하시길...

+ -

관련 글 리스트
2745 [재질문] MDI의 child form을 dll로 구성하려면.. 김대영 3958 2000/01/17
2757     Re:[재질문] MDI의 child form을 dll로 구성하려면.. 박지훈.임프 4325 2000/01/17
2763         Re:Re:[재질문] MDI의 child form을 dll로 구성하려면.. 김대영 3928 2000/01/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.