|
tip'n tricks에서 MDI child를 dll로 만든는 것을 보고 만들어 봤습니다.
실행해 본 결과 몇 가지 안되는 게 있더군요.....
한번 띄운 창 다시 안띄우게 하고 차일드 폼을 죽인 후 다시 불러오게 하려고 다음과 같이 소스를 변경하였습니다.
dll 에서의 createchild 소스입니다.
/////////////////////////////////////TApplication *DllApp = 0;
TfrmAssType *frmAssType = 0;
AnsiString UsrAuth, UsrId, WorkDate, UsrName;
char AppPath[200];
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall CreateChild(
AnsiString wDate, AnsiString uId, AnsiString uAuth,
AnsiString uName, char *aPath, TApplication *App)
{
if(!DllApp)
{
Application->Initialize();
CoInitialize(NULL);
DllApp = Application;
Application = App;
}
try {
if(dynamic_cast<TfrmAssType*>(frmAssType))
{
if(frmAssType->WindowState == wsMinimized)
frmAssType->WindowState = wsNormal;
frmAssType->Show();
return;
}
} catch(...) {} // child window를 다시 생성할 때 에러 무시, try catch 없음 여기서 에러발생함
frmAssType = new TfrmAssType(Application->MainForm);
WorkDate = wDate;
UsrId = uId;
UsrAuth = uAuth;
UsrName = uName;
strcpy(AppPath, aPath);
frmAssType->Show();
}
extern "C" __declspec(dllexport) void __stdcall ResetDllApp()
{
if(DllApp)
{
Application = DllApp;
}
}
///////////////////////////////////////////////////////////////////
그리고 이 dll를 사용하는 곳에서는
void __fastcall TfrmMain::FormCloseQuery(TObject *Sender, bool &CanClose)
{
char str[200];
if(IsUsed[ASSTYPEDLL])
{
typedef void (__stdcall *IMPPROC)();
HINSTANCE dll;
IMPPROC IM;
strcpy(str, AppPath);
strcat(str, "\\AssTypeDll.dll");
dll=LoadLibrary(str);
IM=(IMPPROC)GetProcAddress(dll,"ResetDllApp");
IM();
FreeLibrary(dll);
}
}
void __fastcall TfrmMain::N23Click(TObject *Sender)
{
char str[200];
typedef void (__stdcall *IMPPROC)(AnsiString, AnsiString, AnsiString, AnsiString, char *, TApplication *);
HINSTANCE dll;
IMPPROC IM;
strcpy(str, AppPath);
strcat(str, "\\AssTypeDll.dll");
dll=LoadLibrary(str);
IM=(IMPPROC)GetProcAddress(dll,"CreateChild");
IM(CDate,UsrID, auth, UsrName, AppPath, Application);
IsUsed[ASSTYPEDLL] = true; // Dll 사용했음을 확인
}
//////////////////////////////////////////////////////////////////////////////////
이렇게해서 프로그램을 돌리면 몇 번은 잘 돌아갑니다.
그런데 문제는....
1. 원격 실행시(Server에 있는 Main 실행 한번 닫은 child는 다시 생성되지 않더라구요
2. 로컬(win98)에서 실행할 때에는 child가 생성되다가 안되다가 그리고 몇번하면 프로그램 오류로
프로그램이 종료가 되버립니다.
어케 이 문제를 해결할 수 있을까요? 부탁드립니다.
그리고 혹시
====>>>> child form 닫을 때 Main Form에서 그 사실을 알 수 있는 방법은 없나요?
많은 조언 부탁드립니다.
|