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
[49982] Re:[질문] DLL에 있는 폼을 여러번 띄울수는 없는건가요?
장성호 [nasilso] 1526 읽음    2007-07-20 10:56
[dll에 전역변수]
DLL에 있는 전역변수도 dll에 있다고 생각하지 마시고
같은 프로젝트라고 생각하십시요

LoadLibrary 를 두번한다고 전역변수가 2개 있는것은 아닙니다.

[DLL에 Form여러번 띄우기]

한번밖에 못띄우냐구요?
아뇨 얼마든지...

변수는 단지 변수일뿐이죠

void __stdcall ConstructorModule()
{
      TFormMain *frm = new TFormMain(NULL);
       frm ->Show();
}

위와 같이 띄우면 얼마든지 띄울수 있겠죠?
근데 위와같이 띄우면 dll 의 FreeLibrary할때 몇개띄웠는지.. 확인이 안된니까..
Form을 delete하지 못하니 문제가 되겠죠?


아래와 같이 하시면...될겁니다.
1. Form을 생성시 List에 기억해두고
2. Dll FreeLibrary하기전에 List에 있는 Form을 모두 delete해줍니다.

TList *FormLst;
void __stdcall ConstructorModule()
{
       if(FormLst==NULL)
       {
           FormLst=new TList;
       }
      TFormMain *frm = new TFormMain(NULL);
       frm ->Show();
       FormLst->Add(frm);                                       //폼을 생성해서 list에 기록해둔다.
}
//-----------------------------------------------------------------------------------
// Dll FreeLibrary 하기전에 DeConstructorModule을 호출해서 생성한 Form을 모두 delete한다
void __stdcall DeConstructorModule() 
{
       if(FormLst)
       {
               for(int i=0;i<FormLst->Count;i++)
              {
                    TFormMain *frm = (TFormMain  *) FromLst->Items[i];
                    delete frm;
               }
               delete FormLst;
       }
}


뭐 저런식으로 하면 문제없을겁니다.

그럼....





시몬 님이 쓰신 글 :
: 안녕하세요
: 폼을 포함한 DLL을 만들었을때 질문이 있습니다.
:
:
: 폼을 포함한 DLL을 만들때 dllMain이 있는 파일의 내용입니다.
: #include <vcl.h>
: #include <windows.h>
: #include "frmMain.h"
:
: #pragma argsused
: BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
: {
:     return 1;
: }
:
: extern "C" void __stdcall ConstructorModule()
: {
:     if (FormMain!=NULL) {
:         ShowMessage("이미 메인폼이 생성되었습니다");
:         return;
:     }
:      FormMain = new TFormMain(NULL);
:      FormMain->Show();
: }
:
: 와 같이 작성하였습니다.
: FormMain은 "frmMain.h"파일에 extern TFormMain *FormMain;
: "frmMain.cpp"파일에 TFormMain *FormMain;로 선언되어 있구요
:
: 이 DLL을 dllInstance = LoadLibraryEx() 로 동적 로드하여 사용합니다.
: 물론 잘 동작합니다 (VC++에서도 말이죠)
: 그런데 dllInstance2 = LoadLibraryEx()로 다른 인스턴스로 다시 로드하여 ConstructorModule()를 호출하면
: "이미 메인폼이 생성되었습니다"라고 나오더군요.
:
: 인스턴스를 하나를 쓴건 아닙니다. 그런데도 이렇게 나온다는 것은
: dll안에 전역으로 선언된 변수는 동적으로 로드해도 하나만 존재한다는 말인가요?
:
: 그렇다면 폼을 포함한 DLL은 한번만 로드해서 사용할 수 밖에 없는건가요?
: FormMain!=NULL 을 체크하지 않으면 그 전에 만든 폼의 포인터를 잃어버리기 때문에 문제가 생기지 않습니까?
: 그래서 체크를 한건데...
: DLL에 있는 폼을 여러번 띄울수는 없는건가요?
:
: 만약 방법이 있다면 답변을 부탁드립니다. 아무리 뒤져봐도 방법이 없는것 같네요 ㅠㅠ

+ -

관련 글 리스트
49973 [질문] DLL에 있는 폼을 여러번 띄울수는 없는건가요? 시몬 1100 2007/07/19
49982     Re:[질문] DLL에 있는 폼을 여러번 띄울수는 없는건가요? 장성호 1526 2007/07/20
49992         정성호님 답변 감사드립니다. 해결되었습니다 ^^ 시몬 1160 2007/07/20
49979     Re:[질문] DLL에 있는 폼을 여러번 띄울수는 없는건가요? .. 1453 2007/07/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.