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
[63020] Re:Re:bpl, dll 머릿속에 요것만 있습니다. 동적 폼.. 무엇이 맞는건가요?
워프 [] 1170 읽음    2010-11-12 15:42
답변감사합니다.

장성호님이 알려주신데로 해보고 폼을 호출하니 잘 됩니다.
다만.. 버튼을 올려놓코 호출하니 버튼은 온데간데 없고.
빈 폼만 나오네요..
혹시나 dll 생성시.. 폼을 추가하는 방법이 맞는지요?
저는 #include "Unit1.cpp" 이렇케 하였는데..
이게 아닌듯 한데.. 어떻케 폼을 추가해야 하나요?

장성호 님이 쓰신 글 :
: dll이든 exe든 같은 버젼으로 만든다면..
:
: dll에  
:
: TForm * GetForm()
: {
:      TForm1*frm=new TForm1(NULL);
:      return frm;
:  }
: 

:
: 위와같이 하시면 될것입니다.
:
: exe에선 님께서 하시는 방법대로 하시구...
: 아래와 같이 쓰시면 될듯 하네요
:
:  void __fastcall TForm2::Button1Click(TObject *Sender)
:  {
:     //생량..
: 
:    TForm *frm=GetForm();
:    frm->ShowModal();
:    delete frm;
: }
: 

:
: 그럼..
:
: TForm1도 TForm2도 모두 TForm을 상속받기 때문에...
: TForm*로 받으시면 됩니다.
:
: -----------------------------------------------------------------
: 만약에..
: 인사과.form  , 총무과.form에 무슨 특별한 기능을 구하고자 한다면...
:
: TForm을 상속받은 T업무Form을 하나 만드시고  virtual로  인터페이스 만들어 두시구요
:
: 인사과Form이나 총무과Form은 T업무Form 상속받아 구현하시구..
:
:
: exe에서는 TForm*대신 T업무Form*로 받아서 동작하도록 하시면 될듯 합니다.ㄷ
:
:
: 그럼...
:
:
: class T업무Form
: {
: public:
:      virtual String test();
: };
: //-------------------------
: class T인사Form :  public T업무Form
: {
: public:
:      String test()
:     {
:           return "인사과";
:     }
: };
: //-------------------------
: class T총무Form :  public T업무Form
: {
: public:
:      String test()
:     {
:           return "총무과";
:     }
: };
: 

:
: //그리고 사용은?
:
:  void __fastcall TForm2::Button1Click(TObject *Sender)
:  {
:     //생량..
: 
:    T업무Form *frm=GetForm();
:    ShowMessage(frm->test()); //공통의 기능 함수 호출...
:    delete frm;
: }
: 

:
: ....
:
: 그럼..
:
:
: 워프 님이 쓰신 글 :
: : 안녕하세요. 워프입니다.
: :
: : VB.NET을 (주)로 하다.. 어떤 계기로 C Builder을 (주)로 잡기로 했습니다.
: : 닷넷에서는 프로젝트를 만들고 exe 에서 dll로 바꾸는것이 너무 쉽고(프로젝트 빌드시에 클래스라이브러리 지정;;)
: : 또한 동적으로 폼을 호출할때에도 어셈블리로드 함수로 dll 참조하여 바로 사용가능하는것이 간단했는데..
: :
: : 빌더에서는 이렇케나 어려운것인지..
: : 4~5일 이것만 고민하고 있습니다. 무엇이 맞는지.. 또 무엇이 해답일지..
: : 저와 같은 초입분들이 많이 계실까요?;; 여하튼.. 아래의 소스를 확인하여 주세요.
: :
: : 사용환경은 Builder XE 입니다. (30)
: :
: : // dll 프로젝트를 아래와 같이 만들었습니다.
: : // 그리고 useFrm이라는 폼을 하나 생성하였습니다.
: : //----- 프로젝트 -> New Project -> Dynamic-link Library -> c++ / Use Vcl체크
: :
: : ################################## File1.cpp 내용#######################
: : #include <vcl.h>
: : #include <windows.h>
: : //USEFORM("Unit1.cpp", Form1);    // -> 사용방법을 몰라서 아래처럼.. 컴파일시에
: :                                   //    waring뜨더군요... Unit1.obj 와 File1.obj 충돌경고;;
: :
: : #include "Unit1.cpp" // 이렇케 하는게 맞는지요.
: :
: : #pragma hdrstop
: : /* ....
: : */
: : #pragma argsused
: :
: : extern "C" {
: :     __declspec(dllexport) void __stdcall showfrm(void){
: :         TForm1* frm = new TForm1(0);
: :         frm->ShowModal();
: :
: :         delete frm;
: :     }
: : }
: : int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
: : {
: :     return 1;
: : }
: : #################################################################
: :
: :
: :
: : // 이제 dll 동적 폼을 위한 테스트를 하기위해 아래와 같이
: : // 폼위에 버튼을 추가 하여 버튼글릭시 dll을 참조하여 dll폼을 호출하였습니다.
: :
: : ################### Unit2.cpp 소스 부분###############################
: :
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "Unit2.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TForm2 *Form2;
: : //---------------------------------------------------------------------------
: : __fastcall TForm2::TForm2(TComponent* Owner)
: :     : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall TForm2::Button1Click(TObject *Sender)
: : {
: :     /*
: :     볼랜드포럼, 구글신, 등등에서 보면 동적호출하는 방법에서 디스크립터(핸들?)
: :     선언하는게 여러가지가 있어서.. 무엇을 써야할지 모르겠습니다.
: :
: :     1. HMODULE dll;
: :     2. HINSTANCE dll;
: :     3. HINSTANCE__ dll;
: :     */
: :
: :     HINSTANCE dll;   // 우선 이 타입으로 선언을 했습니다.
: :
: :     /*
: :     이부분에서도, LoadLibrary로 쓰시는 분들부터.. LoadLibraryEx등 각양각색이던데..
: :     XE 버전에서는 아래와 같이 인텔리센스? 에 나타나는 것은 4개더군요..
: :     무엇을 써야 할까요?
: :     1. LoadLibraryA();
: :     2. LoadLibraryExA();
: :     3. LoadLibraryExW();
: :     4. LoadLibraryW();
: :     */
: :
: :     dll = LoadLibrary(L"Project1.dll"); // 같은 폴더에 dll파일을 넣었습니다.
: : //  dll = LoadLibrary("Project1.dll") 이렇케 했을경우에는 문제가 나더군요.. XE에서만 그런가요?
: :
: :
: :     typedef __declspec(dllimport) void (*SHOWFORM)(void); // 이부분도.. 여러 해답이;;
: :     // 1. typedef void (*SHOWFORM)(void)
: :     // 2. typedef void __stdcall (*SHOWFORM)(void)        // 방식이 도데체 몇개나;;;
: :
: :     SHOWFORM frm = (SHOWFORM)GetProcAddress(dll,"showfrm");
: :
: :     frm();          // 호출부분.. 호출이 이루어집니다. 다만.. dll의 Form1 객체를(클래스)
: :                     // 직접가지고 올수 있을까요?
: :                     // dll 부분에 Form1(클래스)객체의 포인터를 넘기면 되겠지만..
: :                     // type을 명시해줘야 하는데... 고민입니다.
: :     // 제가 하고싶은것은
: :     // 인사과.dll, 총무과.dll, ... 등으로 화면을 별도 개발하여
: :     // 차후 업데이트시에 dll만 배포하려고 합니다.
: :     // 메인(exe)은 넘어오는 dll이름을 가지고 동적메뉴를 생성하게 했습니다.
: :     //
: :     // 닷넷에서는 어셈블리로드 함수로 그 dll 파일을 직접물고 위에 설명드린것처럼
: :     // 여러 dll로 나누어 관리 할수 있었는데..
: :     // 지금 이걸루 거진 4~5일을 씨름하고 있습니다. ㅠㅠ
: :
: :     // bpl로 만들어서 동적으로 폼을 호출하는 방법은 도대체 어찌해야 할까요..
: :     // 그리고 무엇이 더 관리상 편할까요..
: :
: :     // 닷넷에서 넘어와... C Builder에 빠져있는 워프였습니다. ㅠㅠ 도움부탁드리겠습니다.
: :
: :
: :
: : }
: :
: : ###########################################################################
: :
: : 내용이 길어서 읽어 보시기 힘드시죠?..
: : 보시는 시간에 시각에 알흠다움을 보여드리고 싶지만...
: : 상황봐서요 ㅠㅠ(은;

+ -

관련 글 리스트
63018 bpl, dll 머릿속에 요것만 있습니다. 동적 폼.. 무엇이 맞는건가요? 워프 1487 2010/11/12
63019     Re:bpl, dll 머릿속에 요것만 있습니다. 동적 폼.. 무엇이 맞는건가요? 장성호 1076 2010/11/12
63020         Re:Re:bpl, dll 머릿속에 요것만 있습니다. 동적 폼.. 무엇이 맞는건가요? 워프 1170 2010/11/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.