답변이 아닙니다.
저도 지금 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으로 선언된 함수도
: 잘 동작합니다.
: 현재 위치하고 사이즈도 확인을 했구요..
:
: 제발 고수님들 조그만 조언이라도 부탁드립니다.
|