dll extern 함수에서 Owner를 받도록 합니다.
extern "C" __declspec(dllexport) void __stdcall ShowForm(TForm *AOwner, void *MyConvert);
//---------------------------------------------------------------------------
// 외부에서 본 DLL을 호출할 인터페이스
//---------------------------------------------------------------------------
void __stdcall ShowForm(TForm *AOwner, void *MyConvert)
{
g_pMyConvert = (TMyConvert *)MyConvert;
frmNewForm = new TfrmNewForm;
// 이렇게 Owner 설정을 해주고요.
frmNewForm->Owner = AOwner;
...
// 그런데, TForm이 StdCall에서 파라미터로 넘기기 찝찝하다면 void 포인터를 캐스팅할 수도 있겠네요.
// 해제도 여기서해줄 수 있겠죠
delete frmNewForm;
}
여기서 Owner를 설정해 주면 화면 아래의 패널에 여러 개가 나오는것을 방지할 수는 없지만
ShowModal은 확실히 먹습니다.
메인폼의 호출부에서는
typedef void (__stdcall *IMPPROC)(TForm *, void *);
HINSTANCE DllInstance;
IMPPROC ImpFunc;
DllInstance = LoadLibrary("MyDll.dll");
ImpFunc = (IMPPROC) GetProcAddress(DllInstance, "ShowForm");
// 여기에 호출하는 Owner, 즉 this 객체 포인터를 넘겨줍니다.
ImpFunc(this, g_pMyConvert);
FreeLibrary(DllInstance);
암튼 그리고..
이 부분은 dll의 폼이 갖는 부분입니다.
void __fastcall TfrmNewForm::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.WndParent = FindWindow("TfrmMain", NULL);
}
이 함수는 임프님 말씀대로 잘 돌아갑니다.
그런데, Owner가 설정되어 있으므로, TApplication 인가요 그 핸들을 이용해서 메인폼의 타입을 찾아 갈 수 있지 않을까 합니다.
그런데, CreateParams가 FormCreate보다 먼저 호출되는지 어쩐지는 잘 모르겠습니다. 어쨌든 핸들이 있어야 CreateParam도 호출이 될 테니까, Create -> Owner 설정 이후가 아닐까 기대를 가져봅니다.
관심있는 분들은 더 테스트 해보시기 바라고..
어쨌든, CreateParams에서 특정 이름으로 메인폼의 이름을 박아 넣는것보다 보다 좋은 방법을 찾을 수 있을 것 같네요.
오랫만에 길게 리플 남기네요. ^^
그럼 즐프하세요.
//---------------------------------------------------------------------------
님이 쓰신 글 :
: 감사합니다. ^^ 얼렁 와서 지울려고 그랬는데 리플 달려 있어서 그냥 둡니다.
: 그럼 즐프하세요~
:
: utime.김성하 님이 쓰신 글 :
: : 안녕하세요 utime.김성하 입니다.
: :
: : 델마당에 나온 팁이 있는데 아래 URL 참조해 보시면 좋은 결과 있을 것입니다.
: :
: :
http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec3&mode=read&num=3211&page=1&backdepth=1
: :
: :
: :
: : Batman 님이 쓰신 글 :
: : : 아래의 방법도 문제가 있기는 마찬가지입니다.
: : :
: : : 차라리, extern 함수에 Owner를 넘겨주는 방식이 보다 안정적이지요.
: : :
: : : 이렇게 하면 모달은 해결되는데 작업표시줄은 해결이 안되네요.
: : :
: : : 음...
: : :
: : : Julien 님이 쓰신 글 :
: : : :
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=45
: : : :
: : : : 다음부턴 질문하기 전에 찾아보세요
: : : :
: : : : Poichel 님이 쓰신 글 :
: : : : : 안녕하세요
: : : : : 질문입니다...... ^^;
: : : : : 프로그램 하나 만들고 있는데요 모듈별로 만들어서 합하는데
: : : : : 왕 짜증나는 일이 생겼습니다
: : : : :
: : : : : 메인폼에서 DLL로 만들어진 하부폼들을 사용하는데
: : : : : 폼을 띄울때마다 작업줄에 새로운 프로그램으로 등록되어 나타납니다
: : : : :
: : : : : 그냥 무시해두 되겠지만....
: : : : : ShowModal()로 띄워서 하부폼이 떴을땐 메인폼으로의 접근을 막아야 하는데
: : : : : 작업 표시줄에 등록된 아이콘들 땜시....... ㅡㅡ;
: : : : : 작업표시줄을 통해 직접 접근이 되어버립니다
: : : : :
: : : : : DLL에 넣지않구 메임폼에 포함시키면 안그러는디 꼭 DLL에 들어가면 그러네요
: : : : :
: : : : : 뭔가 파라미터를 전달을 안해서인지.....
: : : : :
: : : : : 도움 부탁드립니다 ^^;;
: : : : :
: : : : :
: : : : :
: : : : :
: : : : :