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
[50374] Re:[질문]폼을 포함한 DLL을 로드하여 사용할때 TOpenDialog를 사용하면 안되나요??
장성호 [nasilso] 2386 읽음    2007-08-24 19:05
답변이 아닙니다.

저도 지금 Form이 포함된 dll을 여럿 프로그램에서 사용합니다.
완전히 폼이 사라지는 현상은 없구요

메인 Application에서 OpenDialog를 띄울때랑 Dll안에 있는  폼에서 OpenDialog를 띄울때랑
Close할때 자세히 보니 껌벅거림이  다르더군요
하지만 깨어지고 하진 않습니다.
dll 안에 폼이나 혹시 밖에 폼디자인이 너무 복잡하지는 않는지요?

간단히 exe에 폼하나 dll에 폼하나 Dialog하나 넣어서 테스트 해보세요



[참고]

그래도 좀 이상해서  VCL 코드를 살펴 봤습니다.
TOpenDialog의 Execute() 함수를 요


Execute() 함수에서 에서 Dialog를 Show하는 부분은
TOpenDialog의 부모인 TCommonDialog의 TaskModalDialog라는 메소드를 호출하더군요


아래는 TCommonDialog->TaskModalDialog 메소드 소스입니다.

//---------------------------------------------------------------------------
function TCommonDialog.TaskModalDialog(DialogFunc: Pointer; var DialogData): Bool;
type
  TDialogFunc = function(var DialogData): Bool stdcall;
var
  ActiveWindow: HWnd;
  WindowList: Pointer;
  FPUControlWord: Word;
  FocusState: TFocusState;
begin
  ActiveWindow := GetActiveWindow;
  WindowList := DisableTaskWindows(0);
  FocusState := SaveFocusState;
  try
    Application.HookMainWindow(MessageHook);                         //==> 특이한 부분?
    asm
      // Avoid FPU control word change in NETRAP.dll, NETAPI32.dll, etc
      FNSTCW  FPUControlWord
    end;
    try
      CreationControl := Self;
      Result := TDialogFunc(DialogFunc)(DialogData);
    finally
      asm
        FNCLEX
        FLDCW FPUControlWord
      end;
      Application.UnhookMainWindow(MessageHook);              //==> 특이한  부분?
    end;
  finally
    EnableTaskWindows(WindowList);
    SetActiveWindow(ActiveWindow);
    RestoreFocusState(FocusState);
  end;
end;
//---------------------------------------------------------------------------

위에 코드를 보시면  일반 TCustomForm이 ShowModal할때랑 다른것이 있는데...
위코드에 "특이한부분"이라고 주석단곳을 보면 ..
Application.HookMainWindow  라는 함수를 호출하는 겁니다.

저게 어떤 의미인지는 아직 분석을 못해 봤는데....
일반TCustomForm의 ShowModal에는 없는것이죠

그런데 중요한것은   exe와   Dll 의   Application이 다른 객체 같습니다.
디버깅해보면  빌더 IED에서는 hint로 Dll의 Application이나 exe의 Application 객체는 같은 메모리 주소를 보여주던데
if  문으로 비교해보니 다르다는군요

-------------------------------------------------
결론적으로  TCustomDialog에서는 Show할때
exe에 있는것이랑   Dll 안에 있는것이랑  다른 Applicaton의 HookMainWindow  를 호출하게 된다는것입니다.
-------------------------------------------------

저것이 어떻역확을 하는지 좀더 분석해 봐야 알겠지만
일단 원인은 그쪽 인것 같습니다.

-------------------------------------------------

제 얘기가 틀렸을수도 있습니다.

더 정확한 원인은 고수님들께....


그럼


시몬 님이 쓰신 글 :
: 폼을 포함한 DLL을 만들었습니다.
: DLL에 있는 폼에서는 TOpenDialog를 사용한 파일열기 기능이 있구요.
:
: 이 DLL을 로드하여 폼을 띄워서 사용하는데 잘 동작합니다.
: 그런데 딱 하나 TOpenDialog를 Execute()해서 다이얼로그가 띄웠다가 닫으면 갑자기
: DLL을 로드해서 띄운 폼이 없어져 버립니다.
: 그냥 없어지는게 아니라 그 자리에는 복원(repaint)이 안됩니다. - 스샷 첨부파일을 올렸습니다
:
: 이런 현상이 왜 일어날까요???
: 그런데 더 이상한건 사라져 버린 윈도우에 메세지도 잘 도착하고 그 폼에 public으로 선언된 함수도
: 잘 동작합니다.
: 현재 위치하고 사이즈도 확인을 했구요..
:
: 제발 고수님들 조그만 조언이라도 부탁드립니다.

+ -

관련 글 리스트
50372 [질문]폼을 포함한 DLL을 로드하여 사용할때 TOpenDialog를 사용하면 안되나요?? 시몬 2135 2007/08/24
50392     Re:[질문]폼을 포함한 DLL을 로드하여 ... 이번에는 해답에 가까운 답변입니다. 장성호 2177 2007/08/27
50394         Re:Re:[질문]폼을 포함한 DLL을 로드하여 ... 이번에는 해답에 가까운 답변입니다. 박지훈.임프 3191 2007/08/27
50386     Re:[질문]폼을 포함한 DLL을 로드하여 사용할때 TOpenDialog를 사용하면 안되나요?? 장성호 2390 2007/08/27
50374     Re:[질문]폼을 포함한 DLL을 로드하여 사용할때 TOpenDialog를 사용하면 안되나요?? 장성호 2386 2007/08/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.