님의 질문 덕택에 저도 여러가지 테스트 해보게 되었습니다.
그덕에 아래와 같은 사실을 알게되었으니 제가 감사하다는 말씀을 드려야 겠네요.
[답변]
exe 및 dll 을 Comfile할때 Project Options에서
Packages 탭 에서 Runtime packages를 exe및 dll둘다 check한후 comfile해서 테스트 해보세요
오늘 여러가지로 테스트 결과 singletone TApplication 객체인 Application이
저 Runtime packages 가 uncheck되었을때는 dll과 exe가 다른 객체로 나타나더군요
둘다 check되었을때는 같은 객체가 되어서
TOpenDialog를 dll에서 사용하는데 껌벅거리는 문제가 없어지구요
dll안에 있는 폼이 작어표시줄에 나타나는원인도
Application객체가 다르기 때문이었습니다.
먼저 답변에 말씀드렸듯이 TOpenDialog의 조상 TCommonDialog 가
comdlg32.dll에 있는 API GetOpenFileNameA 를 호출하기 전에 Applicaoion에 Hook을 걸었다가
GetOpenFileNameA 함수 호출후 Hook을 푸는데..
dll의 Application객체가 exe의 Application과 다르다 보니 TOpenDialog에서 이상한 현상이 나왔던것 같습니다.
[추신]
고수님들께 추가질문 드립니다.
Runtime packages 의 check / uncheck에 따라서 Application 객체가 하나일수도 있구
둘이 될수도 있던데...
왜그런지 정확한 comfile원리와
exe가 run될때 , dll이 load될때 어떻게 동작하는지 설명좀 해주실수 있겠습니까?
미리 감사말씀 드립니다.
그럼
시몬 님이 쓰신 글 :
: 폼을 포함한 DLL을 만들었습니다.
: DLL에 있는 폼에서는 TOpenDialog를 사용한 파일열기 기능이 있구요.
:
: 이 DLL을 로드하여 폼을 띄워서 사용하는데 잘 동작합니다.
: 그런데 딱 하나 TOpenDialog를 Execute()해서 다이얼로그가 띄웠다가 닫으면 갑자기
: DLL을 로드해서 띄운 폼이 없어져 버립니다.
: 그냥 없어지는게 아니라 그 자리에는 복원(repaint)이 안됩니다. - 스샷 첨부파일을 올렸습니다
:
: 이런 현상이 왜 일어날까요???
: 그런데 더 이상한건 사라져 버린 윈도우에 메세지도 잘 도착하고 그 폼에 public으로 선언된 함수도
: 잘 동작합니다.
: 현재 위치하고 사이즈도 확인을 했구요..
:
: 제발 고수님들 조그만 조언이라도 부탁드립니다.
|