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

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[464] C++ Builder 에서 만든 DLL 및 DLL 안의 폼을 MS VC++ 에서 사용합니다.
황경록 [mpbox] 8891 읽음    2005-05-26 14:29
DLLTest1.zip 2.4MB 빌더로 폼을 내장시켜 만든 DLL
TestApp2.zip 4.2MB VC MFC 기반 DLL 테스트 프로그램
동적으로 DLL 을 읽어 들이는 부분 하나.
DLL Form 에 대해 테스크바 영역에 Caption 이 표시되지 않도록 하는 부분 둘.

입니다.

구글형님! 감사합니다~ ㅎ_ㅎ;;;;

VC++ 에서 작성한 윈도우의 Handle 을 적당히 DLL 로 넘기고 DLL 을 동적으로 생성하기 이전에
DLL 의 Application 객체의 Handle 에 덮어 씌어 주면 됩니다.

지금 막 테스트 해봤는데 아주 깔끔하게 잘 되는군요 ^^

Application->Handle = g_hParent;

TForm1* pF1 = new TForm1(NULL);

pF1->ShowModal();



그럼~ 즐빌하세요~
황경록 [mpbox]   2005-05-27 18:03 X
박영목 님 및 임프님에게 감사드립니다.

HWND hDllParent; // 전역

VC++에서 호출할 함수 부분

#define CBUILDER_API extern "C" __declspec(dllexport)

CBUILDER_API void WINAPI DlgSetup( HWND hwnd, int *iSerial )   // Lib로 연결할 때는 WINAPI를 빼야 되는 것 같습니다. --> CBUILDER_API void DlgSetup( HWND hwnd, int *iSerial )
{
  TForm1 *frm;
  int ret;

  hDllParent = hwnd;  //  <<<<<--------------

  frm = new TForm1( NULL, hwnd ); //Application );

  frm->SetData( *iSerial );                   
  ret = frm->ShowModal();
  if( ret==mrOk    ) *iSerial = frm->GetData(); 

  delete frm;
}

이부분을 DLL 호출 당할 폼에 추가해 주시고 물론 header 파일에도

void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);

    //Params.Style     = WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED|WS_POPUPWINDOW|WS_DLGFRAME|DS_MODALFRAME;
    //Params.ExStyle   = WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME|WS_EX_CONTROLPARENT;

    Params.WndParent =  hDllParent;  //  <<<<<--------------
}
수야!╋ [sooya23]   2005-05-30 16:32 X
자료 감사합니다.
수야!╋ [sooya23]   2005-06-04 09:52 X
흠.. 예제 소스랑 아래 댓글에 소스랑 차이가 좀 많네요...
약간 설명을 좀 해주실 수 있으신가요?
황경록 [mpbox]   2005-06-04 13:35 X
예제 소스에서는 App 에서 Handle 을 넘겨주죠? Application.Handle = hParent 등으로요 ^^ 이렇게 하면 DLL 안의 폼을 Show 해도 테스트바 영역에 표시되지 않습니다.

이것이 테크닉(?)이고

아래 덧글 예제는 박영목님이 임프님의 글을 보고 같은 목적을 위해 코드를 만든 거죠.
덭붙이자면 덧글 상의 DLL 함수 호출에 hwnd 를 포함시킨 이유가 여러 어플에서 호출할때를 생각해서 이러한 방법으로도 가능하다라는 것을 보여주는 코드입니다.
황경록 [mpbox]   2005-06-04 13:38 X
음... 문제의 발단은 박영목님이 Q&A 글을 올리셨던 것으로 부터 시작하는데 빌더로 DLL 을 만들어서 VC 에서 사용하는데 빌더로 만든 DLL 속의 폼을 호출하면 테스크바 영역에 폼의 캡션이 나타나는데 부터 시작된 것입니다 ^^..
그래서 같이 고민하던중 DLL 의 Application 객체의 Handle 을 DLL 을 호출한 어플리케이션의 윈도우 핸들로 대체하면 된다는 것을 구글형님에게 배우고 글을 올렸던 것이죠 ^^
황경록 [mpbox]   2005-06-04 13:40 X
예제의 DLL 소스의 Application.Handle = hWnd(대략) 부분을 삭제하고 DLL 의 폼 생성 부분과 폼 자체에 CreateParams 를 추가해서 만드시면 됩니다 ^^
황경록 [mpbox]   2005-06-04 13:43 X
음... 이렇게 하는 것의 이유를 비교해 보시려면

그냥 DLL 에서 폼을 단순하게 생성해서 ShowModal 해보시고
위의 예제와 비교해 보시면 쉽게 이해가 되시리라 봅니다 ^^::

사실 별거(?)는 없는 코드죠 ^^:: 아하하;

+ -

관련 글 리스트
464 C++ Builder 에서 만든 DLL 및 DLL 안의 폼을 MS VC++ 에서 사용합니다. 황경록 8891 2005/05/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.