C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[7395] 도와주세요.....
김성수 [] 1831 읽음    2001-05-11 17:40
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에서 그 사실을 알 수 있는 방법은 없나요?


많은 조언 부탁드립니다.





+ -

관련 글 리스트
7395 도와주세요..... 김성수 1831 2001/05/11
7417     Re:도와주세요..... 박지훈.임프 1876 2001/05/13
7439         Re:Re:도와주세요..... 김성수 1771 2001/05/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.