질문에 대해
말씀하신 내용만으로는 문제를 파악하기 힘드네요
ShowModal은 자신이 Show되어있는 동안
현재 쓰레드의 다른 모든 Window들을 Disable시키기
당연히 그럴수 밖에 없는것이구요(ShowModal의 원래 목적이죠)
Show로 하는게 맞는데....
문제는 왜 Show로 했을때 이상한 현상이 생기는가 이겠죠?
Dll에서 생성한 Form을 Show했더니
"창이 깜박거린다", "다운된다" 라고 하셨는데...
좀더 구체적인 현상을 알고 싶네요..
간단한 샘플 코드를 올려봐 주심이 좋을것도 같구..
Dll에 Form을 포함하는 경우
Dll에 Form을 포함하는 경우 주의할점에 대해 조금 말씀 드리겠습니다.
C++Builder나 Delphi로 윈도우 Application을 만들면
가장 기본 Library인
VCL을 사용해서 만듭니다.
이놈은 IDE버젼별로 거의 다르구요..
C++Builder6은 vcl60.bpl , Delphi 7 은 vcl70.bpl
C++2007 은 vcl100.bpl , C++2009 는 vcl120.bpl
http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&st=S&keyword=%uBC84%uC83C&indx=409013&keyword1=버젼&keyword2=&page=1
이 bpl 은 일종의 Dll 입니다.
그런데 C++Builder 설치 폴더에 가보면 bpl 만 있는게 아니라
Import Library인 xxx.bpi 도 있지만
Static Library인 xxx.lib 도 있습니다.
이 Library는 프로젝트 옵션(링크 옵션)에 따라
exe에 Import Library(xxx.bpi)가 링크 되어서
Loader가 exe(또는 Dll)를 Load할때 과련 Dll인 xxx.bpl 을 load하여 동적으로 link 하기도 하지만
Static Library인 xxx.lib가 link 되면 exe(Dll을 Load할 시점)가 실행할 시점엔 Dll인 xxx.bpl 이 필요 없게 되죠
이 프로젝트 옵션은
Packages 탭의 맨 아랫쪽에 있는
Build with runtime packages 입니다.
이놈을
unchecked하면
Edit박스에 있는 library들이 만들고 있는 exe나 Dll에 Static-Library 가 Link 되구요
Build with runtime packages를 Check하면 Edit박스 안에 Library들이
실행시점에 LoadLibrary하여 Link됩니다.
문제는 Dll과 Exe의 경우 둘중 하나라도
Build with runtime packages옵션을 uncheck 하면
둘다 Static-Library 가 링크 되던가?
아니면 한쪽은 Static-Library , 다른쪽은 Dynamic-Library 가 하게되죠
폼을 포함하는 경우 vcl 이 Dll과 exe 두군데 각각 따로 포함되게 되는 경우가 발생합니다.
이러게 되면 Application객체나 Screen객체가 Dll과 exe가 다른놈이 됩니다.
그뿐만 아니라 Library(VCL)에 있는 전역변수 들이 모두 두개씩 각각 있어서
Dll과 exe에서 다른 변수를 참조하게 되죠
Form이 포함된 Dll을 만드실경우
Build with runtime packages를 check하시고
항목에 반드시 vcl 을 넣으시구 Dll과 exe를 컴파일하셔야 합니다.
그리고 배포할때는 VCLxx.bpl을 함께 배포하시구요
참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=808
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=50394
그럼..
라이손레종ㅎ 님이 쓰신 글 :
: 이전에 질문 올려놓고 기다리다 답변이 없어.. 묻혀 질까 다시 질문을 드립니다...
: 제가 거의 학생 보다 못한 수준입니다.. 쉽게 설명을 드린다면 감사 하겠습니다..
:
: 질문요지는..
: DLL에 폼을 NEW->폼 이렇게 해서 넣었고.. 이폼은 다른 프로그램에서 동적로드하여 DLL폼을 보여주되 다른 폼을
: 선택도 가능 햇으면 합니다.
:
: Q&A를 찾아 보니
: Form2=new TForm2(NULL);
: Form2->ShowModal();
: delete Form2;
:
: 따라하니.. ShowModal로 뛰어 지면 그폼이 종료하기 전까진 다른 폼은 선택한다던지 이런걸 할수가 없더군요..
:
: 다른 Q&A는
: Form2=new TForm2(NULL);
: Form2->Show();
:
: 하고 Action = caFree 하면 된다 하는데.. DLL 파일 만드는데는 오류는 없었지만..
: 동적로드 하여 함수를 호출하면 창이계속 깜빡거리는 현상으로 다운이 되버립니다.
: 이렇게 저렇게 다해도 마찬가지던데요.. 답변 꼭 부탁드립니다..