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
[40449] [자답]DLL의 해결책이 되지 않을까요...
Batman [] 1165 읽음    2005-06-08 11:21
dll extern 함수에서 Owner를 받도록 합니다.
extern "C" __declspec(dllexport) void __stdcall ShowForm(TForm *AOwner, void *MyConvert);

//---------------------------------------------------------------------------
// 외부에서 본 DLL을 호출할 인터페이스
//---------------------------------------------------------------------------
void __stdcall ShowForm(TForm *AOwner, void *MyConvert)
{
      g_pMyConvert = (TMyConvert *)MyConvert;
     frmNewForm = new TfrmNewForm;
     // 이렇게 Owner 설정을 해주고요.
     frmNewForm->Owner = AOwner;
    ...
    // 그런데, TForm이 StdCall에서 파라미터로 넘기기 찝찝하다면 void 포인터를 캐스팅할 수도 있겠네요.
   
    // 해제도 여기서해줄 수 있겠죠
    delete frmNewForm;
}

여기서 Owner를 설정해 주면 화면 아래의 패널에 여러 개가 나오는것을 방지할 수는 없지만
ShowModal은 확실히 먹습니다.


메인폼의 호출부에서는

    typedef void (__stdcall *IMPPROC)(TForm *, void *);
    HINSTANCE DllInstance;
    IMPPROC ImpFunc;
    DllInstance = LoadLibrary("MyDll.dll");
    ImpFunc = (IMPPROC) GetProcAddress(DllInstance, "ShowForm");
    // 여기에 호출하는 Owner, 즉 this 객체 포인터를 넘겨줍니다.
    ImpFunc(this, g_pMyConvert);
    FreeLibrary(DllInstance);


암튼 그리고..
이 부분은 dll의 폼이 갖는 부분입니다.

void __fastcall TfrmNewForm::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.WndParent = FindWindow("TfrmMain", NULL);
}

이 함수는 임프님 말씀대로 잘 돌아갑니다.
그런데, Owner가 설정되어 있으므로, TApplication 인가요 그 핸들을 이용해서 메인폼의 타입을 찾아 갈 수 있지 않을까 합니다.

그런데, CreateParams가 FormCreate보다 먼저 호출되는지 어쩐지는 잘 모르겠습니다. 어쨌든 핸들이 있어야 CreateParam도 호출이 될 테니까, Create -> Owner 설정 이후가 아닐까 기대를 가져봅니다.

관심있는 분들은 더 테스트 해보시기 바라고..

어쨌든, CreateParams에서 특정 이름으로 메인폼의 이름을 박아 넣는것보다 보다 좋은 방법을 찾을 수 있을 것 같네요.

오랫만에 길게 리플 남기네요. ^^
그럼 즐프하세요.
//---------------------------------------------------------------------------



님이 쓰신 글 :
: 감사합니다. ^^ 얼렁 와서 지울려고 그랬는데 리플 달려 있어서 그냥 둡니다.
: 그럼 즐프하세요~
:
: utime.김성하 님이 쓰신 글 :
: : 안녕하세요 utime.김성하 입니다.
: :
: : 델마당에 나온 팁이 있는데 아래 URL 참조해 보시면 좋은 결과 있을 것입니다.
: :
: : http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?db=dmdlec3&mode=read&num=3211&page=1&backdepth=1
: :
: :
: :
: : Batman 님이 쓰신 글 :
: : : 아래의 방법도 문제가 있기는 마찬가지입니다.
: : :
: : : 차라리, extern 함수에 Owner를 넘겨주는 방식이 보다 안정적이지요.
: : :
: : : 이렇게 하면 모달은 해결되는데 작업표시줄은 해결이 안되네요.
: : :
: : : 음...
: : :
: : : Julien 님이 쓰신 글 :
: : : : http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=45
: : : :
: : : : 다음부턴 질문하기 전에 찾아보세요
: : : :
: : : : Poichel 님이 쓰신 글 :
: : : : : 안녕하세요
: : : : : 질문입니다...... ^^;
: : : : : 프로그램 하나 만들고 있는데요 모듈별로 만들어서 합하는데
: : : : : 왕 짜증나는 일이 생겼습니다
: : : : :
: : : : : 메인폼에서 DLL로 만들어진 하부폼들을 사용하는데
: : : : : 폼을 띄울때마다 작업줄에 새로운 프로그램으로 등록되어 나타납니다
: : : : :
: : : : : 그냥 무시해두 되겠지만....
: : : : : ShowModal()로 띄워서 하부폼이 떴을땐 메인폼으로의 접근을 막아야 하는데
: : : : : 작업 표시줄에 등록된 아이콘들 땜시....... ㅡㅡ;
: : : : : 작업표시줄을 통해 직접 접근이 되어버립니다
: : : : :
: : : : : DLL에 넣지않구 메임폼에 포함시키면 안그러는디 꼭 DLL에 들어가면 그러네요
: : : : :
: : : : : 뭔가 파라미터를 전달을 안해서인지.....
: : : : :
: : : : : 도움 부탁드립니다 ^^;;
: : : : :
: : : : :
: : : : :
: : : : :
: : : : :

+ -

관련 글 리스트
40445         Re:Re:[질문] Dll로 만들어진 Form 윈도우를 띄울때 작업줄에 등록을 막으려면? Batman 722 2005/06/08
40446             Re:Re:Re:[질문] Dll로 만들어진 Form 윈도우를 띄울때 작업줄에 등록을 막으려면? utime.김성하 852 2005/06/08
40448                 Re:Re:Re:Re:[질문] Dll로 만들어진 Form 윈도우를 띄울때 작업줄에 등록을 막으려면? 917 2005/06/08
40449                     [자답]DLL의 해결책이 되지 않을까요... Batman 1165 2005/06/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.