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
[7439] Re:Re:도와주세요.....
김성수 [] 1770 읽음    2001-05-14 17:33
제 질문이 모호성을 가지고 있어서 죄송합니다.
우선 제가 프로그램한 플랫폼을 먼저 말씀드리겠습니다.

개발환경
window2000 professional/cbuilder5

dbserver : window2000 server / mssql2000

프로그램을 컴파일한후 배포판으로 만들어서

window2000 server에 깔고 다른 win98이 깔린 컴에서 win2000 server내에 있는 exe파일을 실행시켰습니다.
실행은 아주 잘 됩니다. 그런데 mdi 폼을 한번 부른 뒤 다시 부르면 어떤한 에러도 안 뜨고 그냥 폼만 안떠요.
그런데 배포판을 로컬(win98)컴에 깔아서 실행시키면 되다 안되다 합니다.

제가 컴파일 옵션을 잘 못해서 그런건지? 아님 프로그램 소스에 문제가 있는 건지 도대체 모르겠습니다.
아님 그 안되는 컴이 이상한 건지(사실 제 컴(개발중인)에서는 잘 돌아가거든요....

모든 가능성을 다 알고 싶습니다.(확실한 이유를 알면 정말 좋겠지만.....)

부탁드리겠습니다.


박지훈.임프 님이 쓰신 글 :
: 임펠리테리입니다.
:
: 몇가지 의문이 있는데.. 런타임에서 발생하는 에러(익셉션)의 종류를 알려주셨으면 좋았을텐데요.
: 일단, 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에서 그 사실을 알 수 있는 방법은 없나요?
: :
: :
: : 많은 조언 부탁드립니다.
: :
: :
: :
: :
: :

+ -

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