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
[71578] Re:Re:Re:Re:DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제
funji [youngza0201] 3434 읽음    2014-07-18 16:42
문제 해결했습니다ㅠㅠ
DLL에서 폼을 생성하고 CreateMimicForm() 리턴값을 TForm*로 바꾸었고
FormMmc 의 Show를 Main에서 수행하게 바꾸었습니다.
부족한 글 내용에도 도움을 주셔서 빌더초보님 정말 감사합니다.

<Main.cpp>
typedef TForm* (*call_CreateMimicForm)(HWND,HWND);

extern "C" __declspec(dllimport) TForm* __stdcall CreateMimicForm(HWND hPnl, HWND HApp);

TForm *MmcForm ;
HINSTANCE   Mmc ;

void __fastcall TfmMain::CreateMmcDisplay()
{
     Mmc = LoadLibraryA("MimicDgm.dll");
     if (!Mmc)
     {
         ShowMessage("MmcDgm.dll not loaded");
     }
     else
     {
         call_CreateMmcForm CreateMmcForm;
         CreateMmcForm= (call_CreateMmcForm)GetProcAddress(Mmc, "CreateMmcForm");
         MmcForm = CreateMmcForm(fmMain->pnlMmc_M1->Handle, Application->Handle);
     }
     MmcForm->Show();
}
//----------------------------------------------------------------------------------------
  <Mmc.DLL>
  TForm *__stdcall CreateMmcForm(HWND hPnl, HWND HApp)
  {
      Application->Handle = HApp;
 
     //exe 생성 후 붙이기
     sPath = ExtractFilePath(Application->ExeName);

     FormMmc = new TFormMmc(0);

      SetParent(FormMmc->Handle, hPnl);
 
     // FormMmc->Show();  <<============요때 폼이 하나가 뜹니다.
     return FormMmc;
  }
  //---------------------------------------------------------
  void __stdcall CloseMmcForm()
  {
      if (FormMmc)
      {
          FreeMmcDiagram();
          FormMmc->Close(); 
      }
  }

FreeMmcDiagram() 이 아이는 지금 주석으로 막아놔서 함수안에서 수행하는 부분은 없습니다ㅠㅠㅠ

void __stdcall FreeMmcDiagram()
{
     for (int i=0; i < 1 ; i++)
     {
         //delete Mmc[i];
         //FreeAndNil(Mmc[i]);
     }
}

빌더초보 님이 쓰신 글 :
: call_CreateMmcForm 이 무슨 형인지 불명확하지만 맞다 치고,
: CreateMimicForm, Mimics 도 오타라고 치고,
:
:
: 동일하게 작성해서 테스트해 봤는데, 잘되네요;;
:
:
: 그런데 만약, CreateMmcForm 을 여러번 호출해서 폼을 여러개 띄우고,
:
: CloseMmcForm 을 호출해서 닫으려고 하면, 마지막에 띄운 하나만 닫히는게 정상입니다.
:
:
:
:
: 그런데 질문이 갑자기 헷갈리는데요;;
: 만드려고 하는 시점에 두 개가 만들어진다는 건지,
: 닫히지가 않는다는건지 모르것네요.
:
: 또 실행파일 종료시에 남아 있다는건..
: 해당 프로그램의 Main이 되는 Form을 닫아서 프로그램을 종료했는데도,
: 바탕화면에 Form이 남아 있다는 건가요?
:
:
:
:
:
:
: funji 님이 쓰신 글 :
: : <Main.cpp>
: : void __fastcall TfmMain::CreateMmcDisplay()
: : {
: :     Mmc = LoadLibraryA("MimicDgm.dll");
: :     if (!Mmc)
: :     {
: :         ShowMessage("MmcDgm.dll not loaded");
: :     }
: :     else
: :     {
: :         call_CreateMmcForm CreateMmcForm;
: :         CreateMmcForm= (call_CreateMmcForm)GetProcAddress(Mimics, "CreateMmcForm");
: :         CreateMimicForm(fmMain->pnlMmc_M1->Handle, Application->Handle);
: :     }
: : }
: : //----------------------------------------------------------------------------------------
: :  <Mmc.DLL>
: :  void __stdcall CreateMmcForm(HWND hPnl, HWND HApp)
: :  {
: :      Application->Handle = HApp;
: : 
: :     //exe 생성 후 붙이기
: :     sPath = ExtractFilePath(Application->ExeName);
: :
: :     FormMmc = new TFormMmc(0);
: :
: :      SetParent(FormMmc->Handle, hPnl);
: : 
: :      FormMmc->Show();  <<============요때 폼이 하나가 뜹니다.
: :  }
: :  //---------------------------------------------------------
: :  void __stdcall CloseMmcForm()
: :  {
: :      if (FormMmc)
: :      {
: :          FreeMmcDiagram();
: :          FormMmc->Close(); 
: :      }
: :  }
: :
: : FreeMmcDiagram() 이 아이는 지금 주석으로 막아놔서 함수안에서 수행하는 부분은 없습니다ㅠㅠㅠ
: :
: : void __stdcall FreeMmcDiagram()
: : {
: :     for (int i=0; i < 1 ; i++)
: :     {
: :         //delete Mmc[i];
: :         //FreeAndNil(Mmc[i]);
: :     }
: : }
: :
: :
: :
: :
: :
: : 빌더초보 님이 쓰신 글 :
: : : 소스 내용만으론 Form 이 두개 뜨지 않을것 같은데...
: : :
: : : CreateMmcForm을 두 번 호출하거나
: : : dll의 다른 함수에서 TFormMmc 의 생성자를 호출하거나 하는 상황인걸로 예상 됩니다.
: : :
: : : 어느 시점에 어떻게 dll 의 함수를 호출하는지 알아야 될 것 같네요.
: : :
: : : FreeMmcDiagram() 함수 내용도요.
: : :
: : :
: : :
: : :
: : : funji 님이 쓰신 글 :
: : : : Q&A게시판에서 DLL에서 폼을 생성후에 실행파일을 통해
: : : :  폼을부러오는 게시물을 활용하여 소스를 짜보았습니다.
: : : : 저는 DLL에서 폼을 생성후에 실행파일에 panel위에 올리려고하는데..
: : : : 프로그램을 실행을시키면 폼이 두개 생성을 하게 되더라구요..ㅠㅠㅠ
: : : : <Mmc.DLL>
: : : : void __stdcall CreateMmcForm(HWND hPnl, HWND HApp)
: : : : {
: : : :     Application->Handle = HApp;
: : : :
: : : :     //exe 생성 후 붙이기
: : : :     sPath = ExtractFilePath(Application->ExeName);
: : : :
: : : :     FormMmc = new TFormMmc(0);
: : : :
: : : :     SetParent(FormMmc->Handle, hPnl);
: : : :
: : : :     FormMmc->Show();  <<============요때 폼이 하나가 뜹니다.
: : : : }
: : : : //---------------------------------------------------------
: : : : void __stdcall CloseMmcForm()
: : : : {
: : : :     if (FormMmc)
: : : :     {
: : : :         FreeMmcDiagram();
: : : :         FormMmc->Close(); 
: : : :     }
: : : : }
: : : : FormMmc->Show();  폼이 뜨길래
: : : :
: : : : 실행 파일 프로그램 종료시에 FormMmc->Close(); 이 부분을 적었는데도 남아있더라구여...
: : : : 그런데 더 희안한것은 실행파일에 panel위에 FormMmc이 올라오기는 합니다.
: : : : 이 정체 불명한 폼 제가 어디서 잘못 접근을 한건지 전혀 알수가 없네요ㅠㅠㅠㅠ
: : : : 도와주세여ㅠㅠㅠㅠ

+ -

관련 글 리스트
71573 DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제 funji 3194 2014/07/18
71575     Re:DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제 빌더초보 3355 2014/07/18
71576         Re:Re:DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제 funji 3396 2014/07/18
71577             Re:Re:Re:DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제 빌더초보 3228 2014/07/18
71578                 Re:Re:Re:Re:DLL에서 폼 생성후 .exe에 폼을 올린때 생기는 문제 funji 3434 2014/07/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.