|
임펠리테리입니다.
몇가지 의문이 있는데.. 런타임에서 발생하는 에러(익셉션)의 종류를 알려주셨으면 좋았을텐데요.
일단, dll내의 차일드폼을 생성하는 함수에서 frmAssType 포인터가 유효한지를 알 수 없군요.
폼 포인터인 frmAssType가 유효하다는 것을 보장하려면, 차일드폼을 삭제할 때마다 frmAssType에 NULL을
세팅하고, 매번 폼을 생성하기 전에 이 frmAssType 값이 NULL인가를 검사해줘야 합니다.
그리고 원격실행시라는 것은 무슨 뜻인지 이해가 안되네요. tcp/ip로 실행했다는 말씀이신지.
혹 이정도로 도움이 안되었다면 좀더 자세히 다시 질문을 해주세요.
그럼 이만...
김성수 님이 쓰신 글 :
: 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에서 그 사실을 알 수 있는 방법은 없나요?
:
:
: 많은 조언 부탁드립니다.
:
:
:
:
:
|